图像数字化——图像读取和显示(不调用库函数)

图像读取和显示

一、图像数字化原理

  1. 图像矩阵表示

    • 数字图像本质上是二维/三维矩阵 I∈RH×W×CI \in \mathbb{R}^{H \times W \times C}IRH×W×C
    • 其中 HHH 为高度(行数),WWW 为宽度(列数),CCC 为通道数(RGB图像 C=3C=3C=3
  2. 像素值范围

    • 标准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)

  1. 文件解析

    • 图像文件本质是二进制数据,包含:
      • 文件头:存储尺寸 (W,H)(W,H)(W,H)、色彩模式等元数据
      • 像素数据:按行优先或列优先排列的像素值
  2. 数据结构转换

    • 从文件到内存的映射:
      File→解码Image Object→转换Numpy Array \text{File} \xrightarrow{\text{解码}} \text{Image Object} \xrightarrow{\text{转换}} \text{Numpy Array} File解码 Image Object转换 Numpy Array

三、图像显示原理(display_image)

  1. 色彩空间映射

    • 对于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= RGB = γ(R/255)γ(G/255)γ(B/255)
      其中 γ\gammaγ 为显示器的伽马校正函数
  2. 坐标系统

    • 计算机图形学坐标系:
      {原点:(0,0)位于左上角x轴向右递增y轴向下递增 \begin{cases} \text{原点}:(0,0) \text{位于左上角} \\ x \text{轴向右递增} \\ y \text{轴向下递增} \end{cases} 原点(0,0)位于左上角x轴向右递增y轴向下递增

四、关键数学概念

  1. 图像采样定理

    • 奈奎斯特频率要求:
      fsampling≥2fmax f_{sampling} \geq 2f_{max} fsampling2fmax
      其中 fmaxf_{max}fmax 是图像中的最高空间频率
  2. 色彩量化

    • 每个通道的量化误差:
      ϵ=12bit_depth \epsilon = \frac{1}{2^{bit\_depth}} ϵ=2bit_depth1
      8位图像 ϵ=1256\epsilon = \frac{1}{256}ϵ=2561

五、技术细节分析

  1. 内存布局

    • 常见存储格式:
      • 行优先: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)
  2. 图像缓冲区

    • 显示过程涉及双缓冲机制:
      Front Buffer↔Back Buffer \text{Front Buffer} \leftrightarrow \text{Back Buffer} Front BufferBack Buffer
      避免屏幕撕裂(tearing)

六、性能考量

  1. 时间复杂度

    • 读取复杂度: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)
  2. 空间复杂度

    • 内存占用:
      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

七、扩展知识

  1. 色彩空间转换

    • RGB到灰度的转换:
      Y=0.299R+0.587G+0.114B Y = 0.299R + 0.587G + 0.114B Y=0.299R+0.587G+0.114B
  2. 图像编码原理

    • JPEG压缩的核心步骤:
      RGB→YCbCr→DCT→Quantization→Huffman Coding \text{RGB} \rightarrow \text{YCbCr} \rightarrow \text{DCT} \rightarrow \text{Quantization} \rightarrow \text{Huffman Coding} RGBYCbCrDCTQuantizationHuffman Coding

八、代码实现

# 导入所需的库
# 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)

结果

运行代码后,将得到一个图形,如下图所示,展示了读取的图像。

图像数字化——图像读取和显示(不调用库函数)_第1张图片

你可能感兴趣的:(python,opencv,目标检测,机器学习,计算机视觉,深度学习,pytorch)