图像数字化——图像读取和显示(不调用库函数)
图像读取和显示
一、图像数字化原理
-
图像矩阵表示:
- 数字图像本质上是二维/三维矩阵 I∈RH×W×CI \in \mathbb{R}^{H \times W \times C}I∈RH×W×C
- 其中 HHH 为高度(行数),WWW 为宽度(列数),CCC 为通道数(RGB图像 C=3C=3C=3)
-
像素值范围:
- 标准8位图像:I(x,y,c)∈[0,255]∩ZI(x,y,c) \in [0,255] \cap \mathbb{Z}I(x,y,c)∈[0,255]∩Z
- 归一化表示:I^(x,y,c)=I(x,y,c)255∈[0,1]\hat{I}(x,y,c) = \frac{I(x,y,c)}{255} \in [0,1]I^(x,y,c)=255I(x,y,c)∈[0,1]
二、图像读取过程(load_image)
-
文件解析:
- 图像文件本质是二进制数据,包含:
- 文件头:存储尺寸 (W,H)(W,H)(W,H)、色彩模式等元数据
- 像素数据:按行优先或列优先排列的像素值
- 图像文件本质是二进制数据,包含:
-
数据结构转换:
- 从文件到内存的映射:
File→解码Image Object→转换Numpy Array \text{File} \xrightarrow{\text{解码}} \text{Image Object} \xrightarrow{\text{转换}} \text{Numpy Array} File解码Image Object转换Numpy Array
- 从文件到内存的映射:
三、图像显示原理(display_image)
-
色彩空间映射:
- 对于RGB图像,显示时需要将数值映射到屏幕色彩空间:
Display Color=[R′G′B′]=[γ(R/255)γ(G/255)γ(B/255)] \text{Display Color} = \begin{bmatrix} R' \\ G' \\ B' \end{bmatrix} = \begin{bmatrix} \gamma(R/255) \\ \gamma(G/255) \\ \gamma(B/255) \end{bmatrix} Display Color=R′G′B′=γ(R/255)γ(G/255)γ(B/255)
其中 γ\gammaγ 为显示器的伽马校正函数
- 对于RGB图像,显示时需要将数值映射到屏幕色彩空间:
-
坐标系统:
- 计算机图形学坐标系:
{原点:(0,0)位于左上角x轴向右递增y轴向下递增 \begin{cases} \text{原点}:(0,0) \text{位于左上角} \\ x \text{轴向右递增} \\ y \text{轴向下递增} \end{cases} ⎩⎨⎧原点:(0,0)位于左上角x轴向右递增y轴向下递增
- 计算机图形学坐标系:
四、关键数学概念
-
图像采样定理:
- 奈奎斯特频率要求:
fsampling≥2fmax f_{sampling} \geq 2f_{max} fsampling≥2fmax
其中 fmaxf_{max}fmax 是图像中的最高空间频率
- 奈奎斯特频率要求:
-
色彩量化:
- 每个通道的量化误差:
ϵ=12bit_depth \epsilon = \frac{1}{2^{bit\_depth}} ϵ=2bit_depth1
8位图像 ϵ=1256\epsilon = \frac{1}{256}ϵ=2561
- 每个通道的量化误差:
五、技术细节分析
-
内存布局:
- 常见存储格式:
- 行优先:Irow_major[y×W+x]=I(x,y)I_{row\_major}[y \times W + x] = I(x,y)Irow_major[y×W+x]=I(x,y)
- 列优先:Icol_major[x×H+y]=I(x,y)I_{col\_major}[x \times H + y] = I(x,y)Icol_major[x×H+y]=I(x,y)
- 常见存储格式:
-
图像缓冲区:
- 显示过程涉及双缓冲机制:
Front Buffer↔Back Buffer \text{Front Buffer} \leftrightarrow \text{Back Buffer} Front Buffer↔Back Buffer
避免屏幕撕裂(tearing)
- 显示过程涉及双缓冲机制:
六、性能考量
-
时间复杂度:
- 读取复杂度:O(H×W×C)O(H \times W \times C)O(H×W×C)
- 显示复杂度:O(H×W×C)O(H \times W \times C)O(H×W×C)
-
空间复杂度:
- 内存占用:
M=H×W×C×bpp(bits per pixel) M = H \times W \times C \times bpp \quad \text{(bits per pixel)} M=H×W×C×bpp(bits per pixel)
8位RGB图像:M=H×W×3×8M = H \times W \times 3 \times 8M=H×W×3×8 bits
- 内存占用:
七、扩展知识
-
色彩空间转换:
- RGB到灰度的转换:
Y=0.299R+0.587G+0.114B Y = 0.299R + 0.587G + 0.114B Y=0.299R+0.587G+0.114B
- RGB到灰度的转换:
-
图像编码原理:
- JPEG压缩的核心步骤:
RGB→YCbCr→DCT→Quantization→Huffman Coding \text{RGB} \rightarrow \text{YCbCr} \rightarrow \text{DCT} \rightarrow \text{Quantization} \rightarrow \text{Huffman Coding} RGB→YCbCr→DCT→Quantization→Huffman Coding
- JPEG压缩的核心步骤:
八、代码实现
# 导入所需的库
# PIL (Pillow) 库用于图像处理,提供了打开、操作图像的功能
from PIL import Image
# NumPy 库用于数值计算,这里用于将图像转换为数组进行处理
import numpy as np
# Matplotlib 的 pyplot 模块用于图像显示
import matplotlib.pyplot as plt
# 读取图像函数
def load_image(image_path):
"""
读取指定路径的图像文件
参数:
image_path (str): 图像文件的路径,包括文件名和扩展名
例如:"images/photo.jpg"
返回:
Image对象: PIL库的Image实例,代表打开的图像
"""
# 使用PIL库的Image.open()方法打开图像
# 该方法支持多种图像格式(JPG、PNG、BMP等)
image = Image.open(image_path)
# 返回打开的图像对象,供后续处理使用
return image
# 显示图像函数
def display_image(image):
"""
显示指定的图像
参数:
image (Image对象): 由PIL库打开的图像对象
"""
# 将PIL的Image对象转换为NumPy数组
# 图像在计算机中本质上是由像素值组成的二维或三维数组
# 转换后可以方便地进行数值处理和显示
image_array = np.array(image)
# 使用matplotlib的imshow()函数显示图像数组
# 该函数能根据数组的数值自动映射为对应的颜色
plt.imshow(image_array)
# 关闭坐标轴显示,使图像显示更整洁
plt.axis('off')
# 显示图像窗口
plt.show()
# 主函数,程序入口
if __name__ == "__main__":
# 图像文件的路径,需要根据实际情况修改
# 这里假设图像文件与脚本在同一目录下,文件名为"imori.jpg"
image_path = "imori.jpg" # 替换为你的图像文件路径
# 调用load_image函数读取图像
image = load_image(image_path)
# 调用display_image函数显示图像
display_image(image)
结果
运行代码后,将得到一个图形,如下图所示,展示了读取的图像。


浙公网安备 33010602011771号