颜色空间转换
在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。我们要用到的函数是cv2.cvtColor(input_image,flag),其中 flag就是转换类型。
灰度图(Grayscale Image)是一种只有亮度信息而没有颜色信息的图像。在灰度图中,每个像素只有一个灰度值(或亮度值),通常在0到255之间表示。灰度图在计算机视觉和图像处理中应用广泛,包括:
(1) 特征提取:灰度图像可以更容易地提取图像的纹理、边缘、角点等特征,对于计算机视觉算法如目标检测、图像识别等任务有很大的帮助。
(2)去噪:灰度图像相对于彩色图像可以更容易地去除噪声,因为噪声通常表现为颜色上的变化。
(3)节省存储空间:灰度图像只需要一个字节(8位)来表示每个像素,而彩色图像则需要三个或四个字节(24或32位),因此灰度图像在存储和传输时更加高效。
(4)加速计算:在图像处理和计算机视觉任务中,灰度图像的处理速度通常比彩色图像要快,因为每个像素的信息量更小。
下面的代码的作用是列出OpenCV库中所有以"COLOR_"开头的常量。这些常量表示各种颜色空间转换的标志。通过查看这些标志,可以了解OpenCV支持哪些颜色空间的转换以及如何使用它们。
import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
注意的是在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179],
S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软件的 HSV 值进行对比时,一定要记得归一化。
物体跟踪(颜色)
根据HSV的颜色表达方式,
import cv2
import numpy as np
frame = cv2.imread("voice.PNG")
frame = cv2.resize(frame,(int(frame.shape[1]/2),int(frame.shape[0]/2)))
while(1):
# 转换到 HSV
hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
# 设定蓝色的阈值
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
# 根据阈值构建掩模
#掩模操作后的图片只有0和255
mask=cv2.inRange(hsv,lower_blue,upper_blue)
# 对原图像和掩模进行位运算
res=cv2.bitwise_and(frame,frame,mask=mask)
# 显示图像
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k=cv2.waitKey(5)&0xFF
if k==27:
break
# 关闭窗口
cv2.destroyAllWindows()
怎样找到跟踪对象的HSV数值?
当我们知道跟踪对象的RGB时候,就可以运行下面一段代码。
import cv2
import numpy as np
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
几何变换
OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩。
扩展缩放
扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,你也可以指定缩放因子。
cv2.resize()函数中的interpolation参数指定了在调整图像大小时使用的插值方法。常见的插值方法包括:
cv2.INTER_NEAREST:最近邻插值。
cv2.INTER_LINEAR:双线性插值(默认值)。
cv2.INTER_CUBIC:双立方插值。
cv2.INTER_AREA:区域插值。
cv2.INTER_LANCZOS4:Lanczos插值
需要在特定场合下要用特定的参数更好点。
INTER_NEAREST:最近邻插值算法,用于放大图像时不失真的需求,但图像质量比较粗糙。
INTER_LINEAR:双线性插值算法,是默认的插值算法,适用于图像缩小和放大,但放大时可能会失真。
INTER_CUBIC:双三次插值算法,适用于图像放大,比双线性插值更精确,但计算时间较长。
INTER_LANCZOS4:Lanczos插值算法,适用于图像放大,比双三次插值更精确,但计算时间更长。
import cv2
import numpy as np
img = cv2.imread("voice.PNG")
#其中fx fy表示比对输入图片的几倍。1 = 等于img.shape[]
res = cv2.resize(img,None,fx = 1, fy =1 ,interpolation=cv2.INTER_LINEAR)
print("res_x ==",res.shape[1],"res_y == ",res.shape[0])
#获得原图像的长款
height,width=img.shape[:2]
res=cv2.resize(img(2*width,2*height),interpolation=cv2.INTER_CUBIC)
cv2.imshow("res",res)
cv2.waitKey(0)
平移
import cv2
import numpy as np
img = cv2.imread("voice.PNG")
#平移操作
M = np.float32([[1, 0, 100], [0, 1, 50]])
dst = cv2.warpAffine(img,M,(img.shape[1],img.shape[0]))
cv2.imshow(