Skip to main content

OpenCV基本操作

本章介绍OpenCV中的基本图像操作,包括颜色空间转换、图像翻转、ROI区域提取等。

颜色空间转换

OpenCV支持多种颜色空间之间的转换,最常用的是BGR与HSV之间的转换。

# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# HSV转BGR
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
红色
RGB: (255,0,0)
HSV: (0,255,255)
绿色
RGB: (0,255,0)
HSV: (60,255,255)
蓝色
RGB: (0,0,255)
HSV: (120,255,255)

HSV颜色空间

HSV颜色空间由色调(Hue)、饱和度(Saturation)和明度(Value)组成,更符合人类对颜色的感知。

HSV色轮

图像翻转

OpenCV提供了 flip()函数用于图像翻转:

# 水平翻转
horizontal_flip = cv2.flip(img, 1)

# 垂直翻转
vertical_flip = cv2.flip(img, 0)

# 同时水平和垂直翻转
both_flip = cv2.flip(img, -1)
原始图像
水平翻转
垂直翻转
水平+垂直翻转

ROI区域提取

ROI (Region of Interest) 是图像中感兴趣的区域,可以通过切片操作提取:

# 提取ROI区域
roi = img[y:y+h, x:x+w]

# 将ROI区域复制到另一个位置
img[y2:y2+h, x2:x2+w] = roi
ROI原始图像
ROI
提取的ROI区域

ROI应用示例

# 提取人脸区域
face_roi = img[y:y+h, x:x+w]

# 对ROI区域进行模糊处理
blurred_face = cv2.GaussianBlur(face_roi, (25, 25), 0)

# 将模糊后的脸部放回原图
img[y:y+h, x:x+w] = blurred_face
原始图像
模糊区域
处理后图像

图像缩放

使用 resize()函数可以调整图像大小:

# 指定新的尺寸
resized = cv2.resize(img, (width, height))

# 按比例缩放
resized = cv2.resize(img, None, fx=0.5, fy=0.5)

插值方法

方法常量特点
最近邻插值cv2.INTER_NEAREST速度快,质量低
双线性插值cv2.INTER_LINEAR默认方法,平衡速度和质量
双三次插值cv2.INTER_CUBIC质量好,速度慢
Lanczos插值cv2.INTER_LANCZOS4质量最好,最慢

图像旋转

旋转图像需要使用旋转矩阵:

# 获取旋转矩阵
M = cv2.getRotationMatrix2D((cx, cy), angle, scale)

# 应用旋转变换
rotated = cv2.warpAffine(img, M, (w, h))
原始图像
旋转45°
旋转90°

图像仿射变换

仿射变换可以保持平行线仍然平行,但需要三个点来确定变换:

# 定义原始点和目标点
src_pts = np.float32([[0,0], [width-1,0], [0,height-1]])
dst_pts = np.float32([[0,0], [width-1,0], [width-1,height-1]])

# 获取变换矩阵
M = cv2.getAffineTransform(src_pts, dst_pts)

# 应用变换
affine = cv2.warpAffine(img, M, (width, height))
原始图像
仿射变换后

透视变换

透视变换可以将一个四边形变换为另一个四边形,需要四个点来确定变换:

# 定义原始点和目标点
src_pts = np.float32([[56,65], [368,52], [28,387], [389,390]])
dst_pts = np.float32([[0,0], [300,0], [0,300], [300,300]])

# 获取变换矩阵
M = cv2.getPerspectiveTransform(src_pts, dst_pts)

# 应用变换
perspective = cv2.warpPerspective(img, M, (300, 300))
原始图像
透视变换后

图像平滑

图像平滑(模糊)可以用于去除噪声,OpenCV提供了多种平滑方法:

# 均值滤波
blur = cv2.blur(img, (5,5))

# 高斯滤波
gaussian = cv2.GaussianBlur(img, (5,5), 0)

# 中值滤波
median = cv2.medianBlur(img, 5)

# 双边滤波(保留边缘的平滑)
bilateral = cv2.bilateralFilter(img, 9, 75, 75)

滤波器比较

原始图像
均值滤波
去噪但边缘模糊
双边滤波
去噪且保留边缘