OpenCV图像预处理Pipeline调试实战 - 第2节
2. 图像读取与显示
使用 OpenCV / PIL 读取图像 · 图像矩阵表示 · 显示与保存
2.1 图像读取基础
图像预处理的第一步是将图像从磁盘加载到内存中。OpenCV 和 PIL (Pillow) 是 Python 生态中最常用的两个图像处理库,它们提供了简洁的读取接口,但底层数据表示有所不同。
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 图像矩阵表示
数字图像在计算机中表示为多维数组(矩阵)。灰度图像是二维矩阵,每个元素表示像素亮度;彩色图像是三维矩阵,第三维表示颜色通道。
| 属性 | 灰度图 | 彩色图 (BGR/RGB) |
|---|---|---|
| 矩阵维度 | 二维 (H, W) | 三维 (H, W, 3) |
| 数据类型 | uint8 | uint8 |
| 像素范围 | 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') # 根据扩展名自动选择格式
⚠️ 注意事项:
• OpenCV 的
• PIL 的
• 保存时注意文件扩展名与编码参数(如 JPEG 质量、PNG 压缩级别)。
• 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))