第4章 OpenCV入门

图像读取 · 显示 · 保存 · 属性获取 · ROI区域提取

OpenCV(Open Source Computer Vision Library)是计算机视觉领域最核心的库之一。本章将带你掌握最基本的图像 I/O 操作、属性查询以及感兴趣区域(ROI)提取,为后续实时增强算法打下坚实基础。

1. 图像读取

使用 cv2.imread() 函数加载图像。支持多种标志控制颜色通道与深度:

标志值说明
cv2.IMREAD_COLOR1默认,加载为 BGR 彩色图像
cv2.IMREAD_GRAYSCALE0加载为单通道灰度图
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)
磁盘文件 cv2.imread() 解析 · 解码 · 分配内存 numpy 数组

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)
numpy 数组 cv2.imshow() 创建窗口 + 渲染 GUI 窗口

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
numpy 数组 cv2.imwrite() 编码 + 写入 磁盘文件

4. 图像属性获取

通过 numpy 数组的 shape、dtype 等属性获取图像尺寸、通道数、位深等信息。

属性代码说明
高度 / 宽度 / 通道数img.shape返回 (h, w, c) 或 (h, w)
像素总数img.sizeh × 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}")
图像矩阵 shape → (h, w, c) dtype → uint8 属性提取 .shape .size .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 提取在实时增强中常用于局部处理、人脸裁剪、目标检测预处理等场景。

原始图像 ROI 提取 ROI img[y:y+h, x:x+w] 返回新视图 (numpy)

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 已保存")