1.官方文档:
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html#converting-colorspaces
2.RGB、HSV和HSL颜色空间:
https://zhuanlan.zhihu.com/p/67930839
opencv提供了超过150中颜色空间转换,这里我们只关注最常见的两种:BGR-Gray 以及 BGR-HSV。颜色空间转换用的函数为:cv2.cvtColor(src, flag)
比如BGR->GRAY,flag即为cv2.COLOR_BGR2GRAY,BGR->HSV,flag即为cv2.COLOR_BGR2HSV。
这里简单地介绍一下RGB和HSV两种颜色空间,为什么有了RGB来表示颜色,还要用HSV呢?简单地说,RGB表示的颜色空间三个分量相关性太高,连续变化颜色时并不直观,如果直接用欧氏距离来表示颜色相关性的话,得到的结果不符合人的视觉效果。 由于RGB表示的颜色空间均匀性较差,所以在图像处理时,通常使用HSV颜色空间,HSV分别代表三个值:
值得注意的是:在opencv中,Hue的范围为[0, 179],Saturation为[0, 255],Value为[0,255]
如果要将对应的RGB值转换为HSV的话,可以使用如下代码:
# 以绿色为例
green = np.uint8([[[0, 255, 0]]])
hsv = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv)
# [[[ 60 255 255]]]
关于色彩空间的详细说明,可以参照参考依据的第二个链接,这里不做过多介绍。
知道了HSV的一些原理以及它的特点(颜色空间均匀性好),可以利用HSV来简单设计一个程序,追踪有色物体,这里紧贴时事,就以在摄像头中追踪捕捉一下口罩为例吧。
cap = cv2.VideoCapture(0) # 获取摄像头设备
while True:
_, frame = cap.read()
cv2.imshow('1', frame)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # BGR -> HSV
# 定义阈值范围,保留蓝色的色域,标准的蓝色为120,255,255
lower_blue = np.array([75, 60, 60])
upper_blue = np.array([120, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue) # 使用inRange保留蓝色区域
cv2.imshow('2', mask)
# 提取蓝色区域
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('3', res)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()