对OpenCV图像处理中最常用的操作:颜色空间变换、图像掩码、图像变换(仿射变换、透视变换等),进行整理介绍
一、颜色空间转换
转换颜色空间
OpenCV中常用到的颜色空间转换的方法主要是两种:BGR<->GRAY和BGR<->HSV。用到的函数是cv2.cvtColor(input_image, flag),其中flag是转换类型。1
2
3
4
5
6import cv2
img = cv2.imread('image', image02.jpg)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('image', hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()物体跟踪
可以利用转换颜色空间来提取带有某个特定颜色的物体。在HSV颜色空间中要比在BGR中更容易表示一个特定颜色。比如以在一幅图片中提取蓝色物体为例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import cv2
import numpy as np
#获取图片并转化到HSV
img = cv2.imread('image02.jpg', cv2.IMREAD_COLOR)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#设定蓝色的阀值
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
#根据阀值进行掩模
mask = cv2.inRange(hsv, lower_blue, upper_blue)
#对原图像和掩模进行位运算
res = cv2.bitwise_and(img, img, mask=mask)
#展示
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、图像变换
图像的集合变换在计算机视觉任务的数据与处理部分很重要,能更好的清洗数据。可采用的变换模型有:刚性变换、仿射变换、透视变换、非线性变换等(参考链接[link1][link2][link3])。目标图像变换后所得点坐标不一定为整数像素,此时应进行插值。
OpenCV提供了两个变换函数:
1 | #参数:输入图像,变换矩阵,输出图像大小,插值方法的组合,边界像素模式,边界填充值(默认为0) |
扩展缩放
1
2#参数:图像、newSize、插值方法
res = cv2.resize(img, (newWidth,newHeight), interpolation=cv2.INTER_LINEAR)平移
1
2
3M = np.float32([[1, 0, x], [0, 1, y]])
# image.shape[0]垂直尺寸、shape[1]水平尺寸、shape[2]通道数
shifted = cv2.warpAffine(img, M, (image.shape[1], image.shape[0]))旋转
1
2
3
4
5# 通过内置的函数得到仿射矩阵M,这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M = cv2.getRotationMatrix2D((cols/2,rows/2), 45, 0.6)
# 第三个参数是输出图像的尺寸中心
dst = cv2.warpAffine(img, M, (2*cols,2*rows))

- 仿射变换
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵需要从原图像中找到三个点以及它们在输出图像的位置。1
2
3
4pts1=np.float32([[50,50],[200,50],[50,200]])
pts2=np.float32([[10,100],[200,50],[100,250]])
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(img,M,(cols,rows))

- 透视变换
透视变换就相当于视角的变换:1
2
3
4pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpPerspective(img,M,(300,300))
