第2章 图像读取与显示

使用 OpenCV / PIL 读取图像 · 图像矩阵表示 · 显示与保存

2.1 图像读取基础

图像预处理的第一步是将图像从磁盘加载到内存中。OpenCV 和 PIL (Pillow) 是 Python 生态中最常用的两个图像处理库,它们提供了简洁的读取接口,但底层数据表示有所不同。

磁盘图像文件 OpenCV cv2.imread() PIL Image.open() NumPy 数组 / 图像矩阵

OpenCV 读取

使用 cv2.imread(path, flags) 读取图像,默认返回 BGR 顺序的 NumPy 数组,数据类型为 uint8。

import cv2
# 读取彩色图像 (BGR)
img = cv2.imread('example.jpg')
print(type(img))        # <class 'numpy.ndarray'>
print(img.shape)        # (height, width, 3)
print(img.dtype)        # uint8

# 以灰度模式读取
gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
print(gray.shape)       # (height, width)

PIL (Pillow) 读取

PIL 的 Image.open() 返回一个 Image 对象,可通过 np.array() 转为 NumPy 数组,颜色通道为 RGB 顺序。

from PIL import Image
import numpy as np

pil_img = Image.open('example.jpg')
print(pil_img.size)     # (width, height)
print(pil_img.mode)     # 'RGB'

# 转为 NumPy 数组 (RGB)
img_rgb = np.array(pil_img)
print(img_rgb.shape)    # (height, width, 3)
💡 核心区别: OpenCV 使用 BGR 通道顺序,PIL 使用 RGB 顺序。显示或保存时需注意转换,否则颜色会失真。

2.2 图像矩阵表示

数字图像在计算机中表示为多维数组(矩阵)。灰度图像是二维矩阵,每个元素表示像素亮度;彩色图像是三维矩阵,第三维表示颜色通道。

灰度矩阵 128 200 75 34 255 10 89 150 210 H × W 彩色矩阵 (RGB) R G B H × W × 3 → 矩阵属性 • dtype: uint8 (0-255) • shape: (H, W, C) • 像素值 ∈ [0, 255]
属性灰度图彩色图 (BGR/RGB)
矩阵维度二维 (H, W)三维 (H, W, 3)
数据类型uint8uint8
像素范围0 (黑) ~ 255 (白)每个通道 0~255
内存布局连续行优先通道交错 (BGR/BGR...)

2.3 显示与保存图像

显示图像用于可视化验证,保存图像则用于输出预处理结果。OpenCV 和 PIL 都提供了对应的 API。

OpenCV 显示与保存

import cv2

img = cv2.imread('example.jpg')

# 显示图像 (窗口方式)
cv2.imshow('OpenCV Window', img)
cv2.waitKey(0)          # 等待按键
cv2.destroyAllWindows()

# 保存图像
cv2.imwrite('output.jpg', img)   # 支持 jpg, png 等格式

PIL 显示与保存

from PIL import Image

pil_img = Image.open('example.jpg')

# 显示图像 (调用系统默认查看器)
pil_img.show()

# 保存图像
pil_img.save('output.png')       # 根据扩展名自动选择格式
图像矩阵 显示 imshow / show 保存 imwrite / save 磁盘文件 / 屏幕窗口
⚠️ 注意事项:
• OpenCV 的 imshow 在 Jupyter Notebook 中无法直接使用,建议用 matplotlib 或 cv2_imshow (Colab)。
• PIL 的 show() 会调用系统图片查看器,适合快速预览。
• 保存时注意文件扩展名与编码参数(如 JPEG 质量、PNG 压缩级别)。

2.4 综合示例:读取 → 转换 → 显示 → 保存

以下示例展示使用 OpenCV 读取图像,转换为 RGB 后使用 matplotlib 显示,并保存为 PNG 格式。

import cv2
import matplotlib.pyplot as plt

# 读取 BGR 图像
img_bgr = cv2.imread('example.jpg')

# 转换为 RGB (用于正确显示)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

# 使用 matplotlib 显示
plt.imshow(img_rgb)
plt.title('图像预处理示例')
plt.axis('off')
plt.show()

# 保存为 PNG (保持 RGB 顺序)
cv2.imwrite('result.png', cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR))