前言
RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色 混合而成。然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色 调 Hue, 饱和度 Saturation,亮度 Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角 锥体模型
为什么会选择 HSV 空间而不是 RGB 空间? 对于图像而言,识别相应的颜色在 RGB 空间、 HSV 空间或者其它颜色空间都是可行的。之所以选择 HSV,是因为 H 代表的色调基本上可以 确定某种颜色,再结合饱和度和亮度信息判断大于某一个阈值。而 RGB 由三个分量构成,需要判断每种分量的贡献比例。即 HSV 空间的识别的范围更广,更方便。
须知
BGR->Gray 和 BGR->HSV。注意 Gray 和 HSV 不可以互相转换。 颜色空间转 换:cv2.cvtColor(input_image, flag) BGR->Gray: flag 就是 cv2.COLOR_BGR2GRAY BGR->HSV: flag 就是 cv2.COLOR_BGR2HSV OpenCV 中 HSV 颜色空间的取值范围: H [0, 179] S [0, 255] V [0, 255]
掩膜
掩膜的概念描述不太 好理解,它可以被理解为位图,可以进行腐蚀膨胀等形态学的操作。我们只需要知道,在提取感兴趣区域、屏蔽图片某些区域、结构特征提取和特殊图像制作中都可能用到掩膜
import cv2
import numpy as np
#创建图片和颜色块
img=np.ones((240,320,3),dtype=np.uint8)*255
img[100:140,140:180]=[0,0,255]
img[60:100,60:100]=[0,255,255]
img[60:100,220:260]=[255,0,0]
img[140:180,60:100]=[255,0,0]
img[140:180,220:260]=[0,255,255]
(上面的img数组)
#黄红两色的hsv阙值
yellow_lower=np.array([26,43,46])
yellow_upper=np.array([34,255,255])
red_lower=np.array([0,43,46])
red_upper=np.array([10,255,255])
#颜色空间转换 rgb->hsv
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#构建掩膜,并用掩膜进行
#inRange 二参 低于这个值变0 三参高于这个值变0
#取到黄色遮罩
mask_yellow=cv2.inRange(hsv,yellow_lower,yellow_upper)
#取到红色遮罩
mask_red=cv2.inRange(hsv,red_lower,red_upper)
#给这俩遮罩拼一起了
mask=cv2.bitwise_or(mask_yellow,mask_red)
(红色和黄色的遮罩通过bitwise_or结合)
#对二进制数据进行“与”操作 mask参数指定使用的模板(遮罩)
res=cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('image',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果就这样,,,没理解??
img+mask+img=结果,就是两张图通过遮罩"与"在一起,遮罩把原图挡住了,只显示了提取颜色那部分…