????????彩色图像的颜色空间也称为颜色模型或彩色系统,我们都知道,人眼看到的色彩图像都是光的反射形成的。在图像处理中,图像需要通过不同的颜色模型展现。常用的颜色空间有RGB、YCrCb、HSV、GRAY等。
????????人眼中有大量对红、绿、蓝3种颤色敏感的锥状体细胞,因此,我们常用红色(Red, R)、绿色(Green,G)、蓝色(Blue,B)组成的RGB颜色空间表达彩色图像的信息。面向硬件设备的RGB颜色空间主要用于电视机、计算机等电子系统感知、表示和显示图像。
????????RGB颜色空间基于三维直角坐标系,包括R、G、B3个原始光谱分量,如图2-1所示。RGB颜色空间中的R、G、B3个分量的值分别描述了红色、绿色、蓝色的亮度值。为了方便描述,我们将3个分量都进行归一化处理,使得三元组中的每个数值均表示红色、绿色、蓝色三者的比例。在图2-1中,原点(0,0,0)代表黑色,点(1,1,1)代表白色,点(1,0,0)代表红色(R),点(0,1,0)代表绿色(G),点(0,0,1)代表蓝色(B)。
????????RGB 图像由3个图像分量组成,分别是R通道图像、G通道图像和B通道。OpenCV默认的图像格式为BGR,即三个维度为B蓝色、G绿色、R红色。
import cv2
lena=cv2.imread("lena.jpg")
cv2.imshow('before',lena)
#调用通道分离
b,g,r=cv2.split(lena)
#三通道分别显示
cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
【运行结果】
? ? ?? ? ?
【结果分析】三个通道的图像相当于单独的二值图,没有颜色空间显示,所以都显示为灰色图像。
????????GRAY(灰度图像)通常指8位灰度图,具有256个灰度级,像素值的范围是[0,255]。当图像由RGB色彩空间转换为GRAY色彩空间时,其灰度值的计算公式如下:
????????当图像由GRAY色彩空间转换为RGB色彩空间时,一般的处理方式,是RGB通道的值都等于灰度值。
????????OpenCV?提供cv2.cvtColor()函数用于彩色空间转换。语法格式:
dst=cv2.cvtColor(src, code [,dstCn])
【参数说明】
import cv2
lena=cv2.imread("lena.jpg")
gray=cv2.cvtColor(lena,cv2.COLOR_BGR2GRAY)
#==========打印 shape=
print ("lena.shape=",lena.shape)
print ("gray.shape=",gray.shape)
#==========显示效果=
【运行结果】
???????HSV色彩空间从心理学和视觉的角度出发,指出人眼的色彩知觉主要包含三要素:色调(Hue,也称为色相)、饱和度(Saturation)、亮度(Value) 我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。因此,通过调整色调值就能选取不同的颜色,色调的取值区间为[0,360]。饱和度为一比例值,范围是[0,1],具体为所选颜色的纯度值和该颜色最大纯度值之间的比值。饱和度的值为0时,只有灰度。亮度表示色彩的明亮程度,取值范围也是[0,1]
????????从RGB色彩空间转换到HSV色彩空间时,先将RGB色彩空间的值归一化到[0,1]之间,然后再进行计算:
计算结果可能存在H小于0的情况,如果H小于0,则调整为 H=H+360。
????????HSV (色相hue, 饱和度saturation, 明度value), 也称HSB。(B指brightness) 是艺术家们常用的,因为与加法减法混色的术语相比,使用色相,饱和度等概念描述色彩更自然直观。HSV是RGB色彩空间的一种变形,它的内容与色彩尺度与其出处——RGB色彩空间有密切联系。
HSL (色相hue, 饱和度saturation, 亮度lightness/luminance),也称HLS 或 HSI (I指intensity) 与
HSV非常相似,仅用亮度(lightness)替代了明度(brightness)。
二者区别在于,一种纯色的明度等于白色的明度,而纯色的亮度等于中度灰的亮度。
????????cv2.cvtColor()函数中使用cv2.COLOR_BGR2HSV转换码可将图像从BGR色彩空间转换为HSV色彩空间,示例代码如下:
import cv2
lena=cv2.imread("lena.jpg")
cv2.imshow('BGR',lena) #显示图像
img2=cv2.cvtColor(lena,cv2.COLOR_BGR2HSV) #转换色彩空间为HSV
cv2.imshow('HSV',img2) #显示图像
cv2.waitKey(0)
【运行结果】
????????在YCrCb色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。亮度给出了颜色亮或暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。在RGB光源中,绿色分量的影响最大,蓝色分量的影响最小。对8位图像,从RGB色彩空间到YCrCb色彩空间的转换公式为:
从YCrCb色彩空间到RGB色彩空间的转换公式为:
????????cv2.cvtColor()函数中使用cv2.COLOR_BGR2YCrCb转换码可将图像从BGR色彩空间转换为YCrCb色彩空间,示例代码如下:
import cv2
lena=cv2.imread("lena.jpg") #读取图像
cv2.imshow('BGR',lena) #显示图像
img2=cv2.cvtColor(lena,cv2.COLOR_BGR2YCrCb) #转换色彩空间为YCrCb
cv2.imshow('YCrCb',img2) #显示图像
cv2.waitKey(0)
【运行结果】?