opencv 中有几百种颜色空间,可通过如下方式获取;
flags = [i for i in dir(cv) if i.startswith('COLOR')] print(len(flags)) # 296 种
其中最常用的是 gray 和 hsv 空间;
颜色空间转换
opencv 直接读取图片是 RGB 空间,使用 cvtColor 转换到 其他空间
def cvtColor(src, code, dst=None, dstCn=None)
code 表示 转换方式
示例
### BGR --> GRAY img = cv.imread('imgs/2.png') img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) cv.imshow('img', img) cv.imshow('gray', img_gray) cv.waitKey(0)
效果图
### BGR --> HSV img = cv.imread('imgs/2.png') img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) cv.imshow('img', img) cv.imshow('hsv', img_hsv) cv.waitKey(0)
效果图
HSV 空间
在 RGB 空间中,颜色会受到光照影响,且 3个通道也会彼此影响,无法准确描述像素;
在 HSV 空间中,三者相互独立,可准确描述像素的 亮度、饱和度、色调
H(色调):用角度度量,取值范围为0°~360° 颜色的深浅
S(饱和度,深度):表示颜色接近光谱色的程度。通常取值范围为0%~100%,值越大,颜色越饱和。 颜色的分离被定义为饱和度
V(明度):表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
1. 在HSV中比在BGR颜色空间中 更容易表示颜色;
2. HSV对外部照明的微小变化更敏感。它将提供更准确的掩膜,从而获得更好的结果。
============== 2023.2.22 更新 ==============
原图,色度,饱和度,亮度
tricks
1. 在HSV域对V分量使用gamma校正改善亮度问题、或者使用直方图均衡处理V通道提高图像对比度,然后再合并
============== ============== ==============
对象追踪 - 颜色空间的简单应用
利用像素实现对象跟踪,这是最简单的跟踪方式;
步骤:取视频的每一帧 - 从BGR转换到HSV颜色空间 - 对HSV图像设置蓝色范围的阈值 - 掩膜单独提取蓝色对象
代码
cap = cv.VideoCapture(0) while(1): # 读取帧 _, frame = cap.read() frame = cv.imread('imgs/30.png') # 没有视频,拿一张图片做一帧 # 转换颜色空间 BGR 到 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 k == 27: break cv.destroyAllWindows()
效果图
如何获取 HSV像素值
如何获取 RGB空间 追踪像素的 HSV空间 对应的像素值 呢?
只需传递你想要的BGR值,而不是传递图像, 如
green = np.uint8([[[0, 255, 0]]]) hsv_green = cv.cvtColor(green, cv.COLOR_BGR2HSV) print(hsv_green) # [[[ 60 255 255]]] blue = np.uint8([[[255, 0, 0]]]) hsv_blue = cv.cvtColor(blue, cv.COLOR_BGR2HSV) print(hsv_blue) # [[[120 255 255]]]
然后把 [H-10, 100, 100] 和 [H+10, 255, 255] 分别作为下界和上界
除了这个方法之外,你可以使用任何图像编辑工具(如GIMP或任何在线转换器)来查找这些值,但是不要忘记调整HSV范围
参考资料:
https://baike.baidu.com/item/HSV/547122?fr=aladdin HSV颜色模型
http://www.woshicver.com/FifthSection/4_1_%E6%94%B9%E5%8F%98%E9%A2%9C%E8%89%B2%E7%A9%BA%E9%97%B4/ 中文官网
https://mp.weixin.qq.com/s/YvAhBsIT3qSSVh1Ue4UFrg 开始使用 OpenCV 进行对象跟踪
https://blog.csdn.net/Aoman_Hao/article/details/126295498?spm=1001.2014.3001.5502 色彩空间介绍