RGB是一种比较常见的色彩空间类型,除此之外还有一些其他的色彩空间,比如常见的包括GRAY色彩空间(灰度图像)、XYZ色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIEL*a*b*色彩空间、CIEL*u*v*色彩空间、Bayer色彩空间等。每个色彩空间都有自己擅长的领域,因此,为了更方面的处理某个具体问题需要用到色彩空间的类型转换。
色彩空间类型转换是指,将一个色彩空间转换为另一个色彩空间。例如,在进行图像的特征提取、距离计算时,往往先将图像从RGB色彩空间转换灰度色彩空间。一些应用中,可能将色彩空间的图像转换为二值图像。
1. 色彩空间基础
常见的包括GRAY色彩空间(灰度图像)、XYZ色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIEL*a*b*色彩空间、CIEL*u*v*色彩空间、Bayer色彩空间等。
1) GRAY色彩空间
GRAY(灰度图像)通常是指八位灰度图,有256个灰度级【0,255】。当图像有RGB转换为GRAY时,其处理方式如下:
Gray = 0.299*R + 0.587*G + 0.114*B
上述是标准的转换方式,也是OpenCV中使用的转换方式,有时也可以采用简化形式:
当图像由GRAY色彩空间转换为RGB时,最终所有通道的值将是相同的,即R=G=B=Gray
2)XYZ色彩空间
XYZ色彩空间是由CIE定义的,是一种更便于计算的色彩空间,其转换方式为:
将XYZ色彩空间转换为GRB色彩空间:
3)YCrCb色彩空间
人眼视觉系统(HVS, Human Visual System)对颜色的敏感程度要低于对亮度的敏感度。在传统的RGB色彩空间内,三原色具有相同的重要性,但忽略了亮度信息。
在YCrCb色彩空间中,Y代表亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。亮度给了颜色亮或者暗的程度信息,该信息可以通过照明中强度成分的加权和来计算。在RGB光源中,绿色分量的影响最大,蓝色分量的影响最小。
从RGB色彩空间到YCrCb的转换公式:
式中delta的值为:对于8位图象,delta为128;对于16位图像,delta=32768; 对于单精度图像,为0.5。
从YCrCb色彩空间到RGB色彩空间的转换公式:
4)HSV色彩空间
RGB是从硬件的角度提出的颜色模型,在与人眼匹配的过程中可能存在一定差异,HSV是一种面向视觉感知的颜色模型。
HSV色彩空间从心理学和视觉的角度出发,指出人的色彩知觉主要包含三要素:色调(Hue,也叫色相)、饱和度(Saturation)、亮度(Value),色调指光的颜色,饱和度指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。
色调:色调与混合光谱中主要光波长有关。
饱和度:指相对纯净度,或者一种颜色混合白光的数量。纯谱系是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的。如果颜色的饱和度很低,那么它计算所得的色调就不可靠。作为灰度图像显示时,较亮区域对应的颜色具有较高的饱和度。
亮度:反映的是人眼感受光的明暗程度。该指标与物体的反射度有关。对于色彩来讲,若在其中掺入的白色越多,则其亮度越高;掺入的黑色越多,则其亮度越低。
在具体实现上,我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色。色调的取值范围为【0,360】,但为保证取值范围在【0,255】内,在OpenCV中对色调做了映射---除以2,从而将色调范围映射到了【0,180】。
饱和度为一比例值,范围【0,1】,饱和度为0时,只有灰色。亮度的取值范围也是【0,1】。当然,饱和度和亮度也被映射到了【0,255】
我们可以通过调用cv2.cvtColor()函数来实现色彩空间的转换。
5)HLS色彩空间
与HSV色彩空间类似,只是HLS用“光亮度/明度(lightness)”替换了亮度。取值范围也是【0,1】,用它来衡量有多少光线从物体表面反射出来。
6)CIEL*a*b*色彩空间
CIEL*a*b*色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知的角度讲,人所感知到的两种颜色的区别程度,应该与这两个颜色在色彩空间中的距离成正比,这个空间称为均匀色彩空间。
L*分量用来表示像素的亮度,取值范围【0,100】;
a*分量表示从红色到绿色的范围,取值范围【-127,127】;
b*分量表示从黄色到蓝色的范围,取值范围【-127,127】
7)CIEL*u*v*色彩空间
与CIEL*a*b*色彩空间一样,都属于均匀的颜色模型,适用于显示器显示和根据加色原理进行组合的场合。该模型对红色的变化比较敏感,对蓝色的变化不太敏感。
8)Bayer色彩空间
Bayer色彩空间被广泛的用于CCD和CMOS相机中。
2.类型转换函数
在OpenCV内,我们使用cv2.cvtcolor()函数实现色彩空间类型转换:
dst = cv2.cvtcolor(src, code [, dstcn])
参数src 表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等;
参数code 是色彩空间转换码;
可选参数dstcn 是目标图像的通道数。如果参数默认为0,则通道数自动通过原始图像和code得到。
dst表示输出图像,与原始输入图像具有相同的数据类型和深度。
颜色空间的转换都用到了如下约定:
8位图像的取值范围是[0,255];
16位图像的取值范围是[0,65535];
浮点数图像值的范围是[0.0~1.0]。
3. 类型转换实例
import cv2
import numpyas np
imgs = cv2.imread('water.jpg')
gray_img = cv2.cvtColor(imgs,cv2.COLOR_RGB2GRAY)
# 由灰度色彩空间转换为GRB,三个通道的值是一样的,所以得到的仍然是灰度图像
rgb_img = cv2.cvtColor(gray_img,cv2.COLOR_GRAY2RGB)
cv2.imshow('RGB_student',imgs)
cv2.imshow('gray_student',gray_img)
cv2.imshow('RGB2_student',rgb_img)
wait_re = cv2.waitKey(0)
cv2.destroyAllWindows()
网友评论