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)组成,更符合人类对颜色的感知。
图像翻转
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应用示例
# 提取人脸区域
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)
滤波器比较
原始图像
均值滤波
去噪但边缘模糊
双边滤波
去噪且保留边缘