目标
- 颜色空间转换
- 追踪视频中特点颜色的物体
- opencv函数:
cv2.cvtColor()cv2.inRange()
1. 颜色空间转换
- BGR->Gray:
cv2.COLOR_BGR2GRAY
补充:灰度图像,也称为灰阶图像,是一种每个像素只有一个采样颜色的图像。换句话说,它是一个单通道图像,其中每个像素的值代表该点的亮度,而没有颜色信息。灰度图像的像素值通常范围从0(黑色)到255(白色),总共包含256个可能的灰度级别。在灰度图像中,图像的每个像素点都只有一个强度值,这个值决定了该点的颜色深浅。这个值是通过将彩色图像中的红色、绿色和蓝色通道的值按照一定的比例混合得到的。一种常见的转换方法是使用以下公式:gray=R* 0.299+G* 0.587+B* 0.114,其中 R、G 和 B 分别是红色、绿色和蓝色通道的值。这个比例是基于人眼对不同颜色敏感度的不同而设计的,使得转换后的灰度图像尽可能地保留了原始彩色图像的视觉效果。灰度图像在图像处理和计算机视觉中非常重要,因为它们简化了处理过程,同时保留了图像的重要信息,如轮廓、纹理和形状等。此外,灰度图像也常用于图像压缩、图像增强和图像识别等领域。
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- BGR->HSV:
cv2.COLOR_BGR2HSV
HSV空间是一种将颜色信息表示为三个参数的颜色模型,分别是色调(Hue)、饱和度(Saturation)和亮度(Value)或明度(Lightness)。HSV颜色空间更符合人类对颜色的感知方式,因此在图像处理和颜色选择方面非常有用。以下是HSV颜色空间中三个参数的定义:
- 色调:色调表示颜色的类型,即颜色是红色、绿色还是蓝色等。在HSV颜色空间中,色调通常以角度表示,范围从0°到360°,其中:
0°或360°代表红色
120°代表绿色
240°代表蓝色
其他角度则表示这些主色之间的颜色,如60°代表黄色(红色和绿色之间的颜色)。- 饱和度(Saturation):饱和度表示颜色的纯度或强度。饱和度为0意味着颜色是灰色(没有颜色成分),而饱和度为100%(或1)意味着颜色是最纯的颜色。饱和度的范围通常是从0%到100%。
- 亮度(Value) 或 明度(Lightness):亮度(Value)表示颜色的明暗程度,亮度为0意味着黑色,亮度为100%意味着最亮的颜色。
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
2.视频中特点颜色的物体追踪
HSV是一个常用于颜色识别的模型,相比 BGR 更易区分颜色,OpenCV 中色调 H 范围为[0,179],饱和度 S 是[0,255],明度 V 是[0,255]。虽然 H 的理论数值是 0°~360°,但 8 位图像像素点的最大值是 255,所以 OpenCV 中除以了 2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。
例子:使用hsv来显式视频中蓝色物体的例子
- 捕获视频中的一帧
- 从BGR转为HSV
- 提取蓝色范围的物体
- 只显式蓝色物体
import cv2 as cv
import numpy as np
cap=cv.VideoCapture(0)
while(1):
_,frame=cap.read()
#转换到HSV
hsv=cv.cvtColor(frame,cv.COLOR_BGR2HSV)
#定义hsv中蓝色的范围
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
#对 HSV 图像设置阈值以仅获取蓝色
mask=cv.inRange(hsv,lower_blue,upper_blue)
#按位与掩码和原始图像
res=cv.bitwise_and(frame,frame,mask=mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k=cv.waitKey(5) & 0xFF
if key==27:
break
cap.release()
cv.destroyAllWindows()
如何获取蓝色的hsv值的上下限呢:以取 [H-10, 100,100] 和 [H+10, 255, 255] 分别作为上界和下界. 除此之外,你可以使用任何图像编辑工具(如 GIMP)或任何在线转换器来查找这些值,但不要忘记调整 HSV 范围。
blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)#[[[120 255 255]]]
cv2.inRange(hsv, lower_blue, upper_blue):cv2.inRange 函数是 OpenCV 库中用于创建颜色阈值掩码的函数。当你想要在图像中找到特定颜色范围内的像素时,这个函数非常有用。它接受两个参数(除了输入图像和颜色空间),即颜色的下限和上限。cv.bitwise_and是 OpenCV 库中的一个函数,它执行两个数组(通常是图像)的逐像素按位与操作。在图像处理中,这个函数经常用于将前景图像与一个掩码(mask)结合,以便从原始图像中提取特定的区域。
6683

被折叠的 条评论
为什么被折叠?



