【 1. 色彩空间 】
色彩空间(Color space)是对色彩的组织方式,是坐标系统和子空间的阐述,位于系统的每种颜色都有单个点表示。
目前,色彩空间已经有上百种表示方式,被采用的大多数色彩空间都是面向硬件或面向应用的,大部分只是局部的改变或专用于某一领域。
- 使用红色、绿色和蓝色这三种原色生成不同的颜色,这些颜色可以组成了一个色彩空间,称为RGB(Red Green Blue)色彩空间。
- OpenCV中默认的色彩空间是BGR。BGR与RGB的区别只是三个颜色信道的位置发生了变化,实际上原理相同。
( 为什么是BGR而不是RGB呢?原因在于当时主流的摄像头制造商和软件供应商都普遍使用这种BGR格式,所以所以一开始时OpenCV采用的就是BGR,然后沿用至今。)- RGB是依据人眼识别的颜色定义出的空间,可表示大部分颜色。它是最通用的面向硬件的色彩空间。该色彩空间用于彩色监视器和一大类彩色视频摄像。
完整的RGB色彩空间图:
在RGB色彩空间中,将蓝色的量定义为X坐标轴、红色的量定义为Y坐标轴、绿色的量定义为Z坐标轴,就可以得到一个三维空间。所以每种颜色在这个三维空间中都有唯一的一个点与其对应。
在科学研究一般不采用RGB色彩空间,它将色调,亮度,饱和度三个量放在一起表示,很难分开,这样难以对其进行数字化的调整。所以为了更好的数字化处理颜色,提出了HSV,HSL两个色彩空间。
HSV色彩空间中,H是色调(hue),S是饱和度(saturation), V是明度(value)。
HSL色彩空间中,H是色调(hue),S是饱和度(saturation),L是亮度(lightness) 。
- 在OpenCV的灰度空间中,和一般的色彩空间相同,每一个颜色都有三个量,但是只有第一个亮度有值,所以表示为(亮度,0,0)。
- 其中,亮度是根据如下灰度公式计算而得:
G r a y = R ∗ 0.299 + G ∗ 0.587 + B ∗ 0.114 Gray = R*0.299 + G*0.587 + B*0.114 Gray=R∗0.299+G∗0.587+B∗0.114
- 人脸识别需要先对图片进行灰度处理的原因:
识别人脸,最关键的因素是梯度,梯度代表着边缘,用灰度图计算梯度,可以简化矩阵, 提高运算速度。而颜色信息,很容易受到光照等因素的影响,同类的物体颜色有很多变化,所以颜色本身难以提供关键信息。
【 2. 色彩空间转换 】
在OpenCV中有超过150种色彩空间转换的方法。但是我们经常用到的是以下两种:
- BGR空间到Gray空间 的转换;
- BGR空间到HSV空间 的转换。
- 函数:
cv2.cvtColor(图片对象,转换类型)
其中的转换类型:
对于BGR到Gray的转换,为cv2.COLOR_BGR2GRAY类型。
对于BGR到HSV的转换,为cv2.COLOR_BGR2HSV类型。
- 范例:
import cv2 as cv
img = cv.imread('picture.jpg') # 读取图片
newpicture = cv.cvtColor(img, cv.COLOR_BGR2HSV) # 将图片的色彩空间由BGR转换为HSV。
# newpicture = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 将图片的色彩空间由BGR转换为GRAY。
cv.imshow('cute boy',newpicture) # 窗口展示图片
cv.waitKey(0) # 等待用户关闭图片窗口
cv.destroyAllWindows() # 销毁创建的所有窗口
原图:
灰度图片:
HSV图片:
#获取到OpenCV提供的所有转换类型: 。。有问题的代码。。。。
import cv2
flags=[i for in dir(cv2) if i startswith('COLOR_')]
print(flags)