第4章 OpenCV入门
图像读取 · 显示 · 保存 · 属性获取 · ROI区域提取
OpenCV(Open Source Computer Vision Library)是计算机视觉领域最核心的库之一。本章将带你掌握最基本的图像 I/O 操作、属性查询以及感兴趣区域(ROI)提取,为后续实时增强算法打下坚实基础。
1. 图像读取
使用 cv2.imread() 函数加载图像。支持多种标志控制颜色通道与深度:
| 标志 | 值 | 说明 |
|---|---|---|
cv2.IMREAD_COLOR | 1 | 默认,加载为 BGR 彩色图像 |
cv2.IMREAD_GRAYSCALE | 0 | 加载为单通道灰度图 |
cv2.IMREAD_UNCHANGED | -1 | 保留 Alpha 通道(如 PNG) |
import cv2
# 读取彩色图像
img_color = cv2.imread('example.jpg', cv2.IMREAD_COLOR)
# 读取灰度图像
img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)
# 读取包含透明通道的图像
img_unchanged = cv2.imread('example.png', cv2.IMREAD_UNCHANGED)
2. 图像显示
使用 cv2.imshow() 在窗口中显示图像,配合 cv2.waitKey() 和 cv2.destroyAllWindows() 管理窗口生命周期。
cv2.imshow('My Image', img_color)
cv2.waitKey(0) # 等待任意按键
cv2.destroyAllWindows() # 关闭所有窗口
也可以使用 cv2.namedWindow() 预创建窗口并调整大小:
cv2.namedWindow('Resizable', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Resizable', 800, 600)
cv2.imshow('Resizable', img_color)
cv2.waitKey(0)
3. 图像保存
使用 cv2.imwrite() 将图像写入磁盘。支持根据文件扩展名自动选择编码格式。
success = cv2.imwrite('output.jpg', img_color, [cv2.IMWRITE_JPEG_QUALITY, 95])
if success:
print("图像保存成功")
常用保存参数:
cv2.IMWRITE_JPEG_QUALITY: 0~100 (默认 95)cv2.IMWRITE_PNG_COMPRESSION: 0~9 (默认 3)cv2.IMWRITE_WEBP_QUALITY: 0~100
4. 图像属性获取
通过 numpy 数组的 shape、dtype 等属性获取图像尺寸、通道数、位深等信息。
| 属性 | 代码 | 说明 |
|---|---|---|
| 高度 / 宽度 / 通道数 | img.shape | 返回 (h, w, c) 或 (h, w) |
| 像素总数 | img.size | h × w × c |
| 数据类型 | img.dtype | 通常为 uint8 |
import cv2
img = cv2.imread('example.jpg')
h, w, c = img.shape
print(f"尺寸: {w} x {h}, 通道数: {c}")
print(f"像素总数: {img.size}")
print(f"数据类型: {img.dtype}")
5. ROI 区域提取
感兴趣区域(Region of Interest, ROI)是图像处理中裁剪局部区域的基础操作。利用 numpy 切片即可实现:
# 提取从 (x, y) 开始,宽 w,高 h 的区域
roi = img[y:y+h, x:x+w]
# 示例:提取图像中心 200x200 区域
h, w = img.shape[:2]
cx, cy = w // 2, h // 2
roi_center = img[cy-100:cy+100, cx-100:cx+100]
# 将 ROI 区域修改为蓝色 (BGR)
roi_center[:] = (255, 0, 0)
ROI 提取在实时增强中常用于局部处理、人脸裁剪、目标检测预处理等场景。
6. 综合示例:读取 → 显示属性 → 提取 ROI → 保存
import cv2
# 读取图像
img = cv2.imread('scene.jpg', cv2.IMREAD_COLOR)
if img is None:
print("图像读取失败")
exit()
# 获取属性
h, w, c = img.shape
print(f"图像尺寸: {w}x{h}, 通道: {c}")
# 提取中央区域 (ROI)
roi = img[h//4:3*h//4, w//4:3*w//4]
# 显示原图与ROI
cv2.imshow('Original', img)
cv2.imshow('ROI', roi)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存ROI
cv2.imwrite('roi_output.jpg', roi, [cv2.IMWRITE_JPEG_QUALITY, 90])
print("ROI 已保存")