python-openCV学习笔记(3)-色彩空间类型转换

色彩空间类型转换是指,将图像从一个色彩空间转换到另外一个色彩空间。

色彩空间基础

比较常见的色彩空间包括GRAY色彩空间、XYZ色彩空间、YCrCb色彩空间、HSV色彩空间、HLS色彩空间、CIELab色彩空间、CIELuv色彩空间、Bayer色彩空间等。

GRAY色彩空间

GRAY(灰度图像)通常指8位灰度图,其具有256个灰度等级,像素值的范围是[0,255].
当图像由RGB色彩空间转换位GRAY色彩空间时,其处理方式如下:
G r a y = 0.299 ∗ R + 0.587 ∗ G + 0.114 ∗ B Gray=0.299*R+0.587*G+0.114*B Gray=0.299R+0.587G+0.114B
上述是标准的转换方式,也是OpenCV中使用的转换方式。
有时也会采样简化形式完成转换:
G r a y = R + G + B 3 Gray=\frac{ R+G+B }{ 3 } Gray=3R+G+B
当图像由GRAY色彩空间转换为RGB色彩空间时,最终所有通道的值都将相同。
R = G r a y G = G r a y B = G r a y R=Gray\\ G=Gray\\ B=Gray R=GrayG=GrayB=Gray

XYZ色彩空间

XYZ色彩空间是由CIE定义的,是一种更加便于计算的色彩空间,他可以和RGB色彩空间相互转换。
将RGB色彩空间转换为XYZ色彩空间,其转换形式为:
[ X Y Z ] = [ 0.412453 0.357580 0.180423 0.212671 0.715160 0.072169 0.019334 0.119193 0.950227 ] ∗ [ R G B ] \begin{bmatrix}X\\Y\\Z\end{bmatrix}=\begin{bmatrix}0.412453&0.357580&0.180423\\0.212671&0.715160&0.072169\\0.019334&0.119193&0.950227 \end{bmatrix}*\begin{bmatrix}R\\G\\B \end{bmatrix} XYZ = 0.4124530.2126710.0193340.3575800.7151600.1191930.1804230.0721690.950227 RGB
将XYZ色彩空间转换为RGB色彩空间,其转换形式为:
[ R G B ] = [ 3.240479 − 1.53715 − 0.498535 − 0.969256 1.875991 0.041556 0.055648 − 0.204043 1.057311 ] ∗ [ X Y Z ] \begin{bmatrix}R\\G\\B\end{bmatrix}=\begin{bmatrix}3.240479&-1.53715&-0.498535\\-0.969256&1.875991&0.041556\\0.055648&-0.204043&1.057311\end{bmatrix}*\begin{bmatrix}X\\Y\\Z \end{bmatrix} RGB = 3.2404790.9692560.0556481.537151.8759910.2040430.4985350.0415561.057311 XYZ

YCrCb色彩空间

人眼视觉系统(HVS)对颜色的敏感度要低于对亮度的敏感度。在传统是RGB色彩空间内,RGB三原色具有相同的重要性,但是忽略了亮度信息。
在YCrCB色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。
亮度给出了颜色亮或暗的程度信息,该消息通过照明中强度成分的加权和来计算。在RGB光源下,绿色成分的影响最大,蓝色成分的影响最小。
从RGB色彩空间到YCrCb色彩空间的转换公式为:
Y = 0.299 ∗ R + 0.587 ∗ G + 0.114 ∗ B C r = ( R − Y ) ∗ 0.713 + d e l t a C b = ( B − Y ) ∗ 0.564 + d e l t a Y=0.299*R+0.587*G+0.114*B\\ Cr=(R-Y)*0.713+delta\\ Cb=(B-Y)*0.564+delta Y=0.299R+0.587G+0.114BCr=(RY)0.713+deltaCb=(BY)0.564+delta
从YCrCb色彩空间到RGB色彩空间的转换公式为:
R = Y + 1.403 ∗ ( C r − d e l t a ) G = Y − 0.714 ∗ ( C r − d e l t a ) − 0.344 ∗ ( C b − d e l t a ) B = Y + 1.773 ∗ ( C b − d e l t a ) R=Y+1.403*(Cr-delta)\\ G=Y-0.714*(Cr-delta)-0.344*(Cb-delta)\\ B=Y+1.773*(Cb-delta) R=Y+1.403(Crdelta)G=Y0.714(Crdelta)0.344(Cbdelta)B=Y+1.773(Cbdelta)
式中,delta的值为
d e l t a = { 128 , 8位图像 32768 , 16位图像 0.5 , 单精度图像 delta=\begin{cases} 128, &\text{8位图像} \\ 32768, &\text{16位图像} \\ 0.5, &\text{单精度图像} \end{cases} delta= 128,32768,0.5,8位图像16位图像单精度图像

HSV色彩空间

RGB是从硬件的角度提出颜色模型,在与人眼匹配的过程中可能存在一定的差异。但HSV色彩空间不同,是一种面向视觉感知的颜色模型。HSV色彩空间从心理学和视觉角度出发,指出了人眼的色彩知觉主要包含三要素:色调、饱和度、亮度,色调指光的颜色,饱和度指色彩深浅程度、亮度之人眼感受到的光的明暗程度。
色调:色调与混合光谱中主要光波长相关。如果从波长的角度考虑,不同的波长的光表现为不同的颜色,实际上它们体现的是色调的差异。8位图像内每个像素点所能代表的灰度级有256个,所以在8位图像内表示HSV图像时,要把色调的角度值映射到[0,255]范围内,在OpenCV中,可以直接把色调的角度值除以2,得到[0,180]之间的值,以适应8位二进制的存储和表示范围。
饱和度:指相对纯净度,或一种颜色混合白光的数量。纯普色是全饱和的,像深红色(红加白)和淡紫色(紫加白)这样的彩色是欠饱和的,饱和度与所加白光的数量成反比。进行色彩空间转换后,为了适应8位图的256个像素级,需要将新色彩空间映射到[0,255]范围内,所以,同样要将饱和度S的值从[0,1]范围映射到[0,255]范围内。
亮度:反映的是人眼感受到的光的明暗程度,该指标与物体的反射度相关。对于色彩来讲,如果期中参入的白色越多,则亮度越高;如果其中掺入的黑色越多,则其亮度越低。亮度范围与饱和度的范围一样,因此在OpenCV内也将值映射到[0,255]内。
在从RGB色彩空间转换到HSV色彩空间之前**,**_**需要先将RGB色彩空间的值转换到[0, 1]之间,**然后再进行处理。_具体处理方法为:
V = m a x ( R , G , B ) S = { 0 , V=0 v − m i n ( R , G , B ) V , V其他情况 H = { 60 ∗ ( G − B ) V − m i n ( R , G , B ) , V=R 120 + 60 ∗ ( B − R ) V − m i n ( R , G , B ) , V=G 240 + 60 ∗ ( R − G ) V − m i n ( R , G , B ) , V=B V=max(R,G,B)\\ S=\begin{cases} 0,&\text{V=0}\\ \frac{v-min(R,G,B)}{V}, &\text{V其他情况} \end{cases}\\ H=\begin{cases} \frac{60*(G-B)}{V-min(R,G,B)},&\text{V=R}\\ 120+\frac{60*(B-R)}{V-min(R,G,B)}, &\text{V=G}\\ 240+\frac{60*(R-G)}{V-min(R,G,B)}, &\text{V=B}\\ \end{cases} V=max(R,G,B)S={0VvminR,G,B),V=0V其他情况H= Vmin(R,G,B)60(GB)120+Vmin(R,G,B)60(BR),240+Vmin(R,G,B)60(RG),V=RV=GV=B
计算结果可能存在H<0的情况,如果出现这种情况,则需要对H进行进一步计算,如下:
$H=\begin{cases}
H+360,&\text{H<0}\
H, &\text{其他情况}
\end{cases}\$
由上述公式可知:
$S\in[0, 1]\
V\in[0, 1]\
H\in[0, 360]\$

HLS色彩空间

HLS色彩空间包含三要素:色调H、光亮度\明度L、饱和度S与HSV色彩空间类似,只是HLS色彩空间用“光亮度/明度L”替换了“亮度”。
色调:表示人眼所能感知的颜色,在 HLS 模型中,所有的颜色分布在一个平面的色调环上,整个色调环为360度的圆心角,不同的角度代表不同的颜色。
光亮度/明度:用来控制色彩的明暗变化,它的取值范围也是[0,1]。我们通过光亮度/明度的大小来衡量有多少光线从物体表面反射出来。光亮度/明度对于眼睛感知颜色很重要,因为当一个具有色彩的物体处于光线太强或者光线太暗的地方时,眼睛是无法准确感知物体颜色的。
饱和度:使用[0,1]的值描述相同色调、相同光亮度/明度下的色彩纯度变化。饱和度的值越大,表示颜色的纯度越高,颜色越鲜艳;反之,饱和度的值越小,色彩的纯度越低,颜色越暗沉。通常用该属性表示颜色的深浅,比如深绿色、浅绿色

CIELab*色彩空间

CIEL * a * b 色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。从视觉感知均匀的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。
CIEL * a * b 色彩空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a * 分量表示从红色到绿色的范围,取值范围是[-127,127]; b * 分量表示从黄色到蓝色的范围,取值范围是[-127,127]。
在从RGB色彩空间转换到CIEL * a * b * 色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,然后再进行处理。
_由于CIEL * a * b * 色彩空间是在CIE的XYZ色彩空间的基础上发展起来的,在具体处理时,需要先将RGB转换为XYZ色彩空间,再将其转换到CIELa * b *色彩空间。_具体实现方法为:
$\begin{bmatrix}X\Y\Z\end{bmatrix}=\begin{bmatrix}0.412453&0.357580&0.180423\0.212671&0.715160&0.072169\0.019334&0.119193&0.950227 \end{bmatrix}
\begin{bmatrix}R\G\B \end{bmatrix}\
X=\frac{X}{X_n}, X_n=0.950456\
Z=\frac{Z}{Z_n}, Z_n=1.088754\
L=\begin{cases}
116Y^{\frac{1}{3}}-16,&\text{Y>0.008856}\
903.3
Y, &\text{Y其他情况}
\end{cases}\
a=500*(f(X)-f(Y))+delta\
b=200*(f(Y)-f(Z))+delta\$
式中:
$f(t)=\begin{cases}
t^{\frac{1}{3}}-16,&\text{t>0.008856}\
7.787*t+\frac{16}{116}, &\text{其他情况}
\end{cases}\
delta=\begin{cases}
128,&\text{8位图像}\
0, &\text{单精度图像}
\end{cases}\$
由上述公式可知:
$L\in[0, 100]\
a\in[-127, 127]\
b\in[-127, 127]\$

CIELuv*色彩空间

CIEL * u * v * 色彩空间同 CIEL * a * b * 色彩空间一样,都是均匀的颜色模型。CIEL * u * v * 色彩空间与设备无关,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。
下面的公式给出了从RGB色彩空间到CIEL * u * v 色彩空间的转换公式。
从RGB色彩空间到XYZ色彩空间的转换:
$\begin{bmatrix}X\Y\Z\end{bmatrix}=\begin{bmatrix}0.412453&0.357580&0.180423\0.212671&0.715160&0.072169\0.019334&0.119193&0.950227 \end{bmatrix}
\begin{bmatrix}R\G\B \end{bmatrix}\$
从XYZ色彩空间到CIEL * u * v 色彩空间的转换:
$L=\begin{cases}
116
Y^{\frac{1}{3}}-16,&\text{Y>0.008856}\
903.3*Y, &\text{其他情况}
\end{cases}\
u_1=\frac{4X}{X+15Y+3Z}\
v_1=\frac{9Y}{X+15Y+3Z}\
u=13L(u_1-u_n),u_n=0.19793943\
v=13L(v_1-v_n),v_n=0.46831096\$
所得结果中各个值的取值范围分别为:
$L\in[0, 100]\
u\in[-134, 220]\
v\in[-140, 122]\$

Bayer色彩空间

Bayer色彩空间(Bayer模型)被广泛地应用在CCD和CMOS相机中。它能够从如图所示的单平面R、G、B交错表内获取彩色图像。
输出的RGB图像的像素点值,是根据当前点的1个、2个或4个邻域像素点的相同颜色的像素值获得的。上述模式能够通过移动一个左边的像素或者上方的像素来完成修改。在函数cv2.cvtColor()的色彩空间转换参数中,通常使用两个特定的参数x和y来表示特定的模式。该模式组成通过图第二行中的第2列与第3列的值来指定。图就是典型的“BG”模式。

类型转换函数

在OpenCV中,我们使用cv2.cvtColor()函数进行色彩空间的转换。该函数可以实现多个色彩空间的转换。
dst = cv2.cvtColor(src,code[,dstCn])
dst:表示输出图像,与原始输入图像具有同样的数据类型和深度。
src:表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。
code:是色彩空间转换码。
dstCn:是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。
df6b9bb91a94e6919757b84bb0ad213e_43cd55c9522984bbd0ba2996a8a19fdc.png
822e8a48467406cfcb9f93d64c078b1d_a568c0b3e72339636cd0ce6af26626c9.png
ae583a4a5e68fbeb7fb94e8c8b7a608c_34fffbd7d4c7d54fbb042996e79146eb.png
d96773ac7a59163d61fb4f599c434eee_26cb24e3da6e5cb06f527c2c24350501.png
618e8161dc2eff06e4dafcbaa1da7402_9446d016e7ac05240ed933650f993d80.png
1906cafbe9a9555b2542a07f777dabf4_f9f850337191be50ae99f7e560530973.png
注意:BGR色彩空间与传统的RGB色彩空间不同。对于一个标准的24位位图,BGR色彩空中第1个字节存放的是蓝色组成的信息,第2个字节存放的是绿色组成的信息,第3个字节存放的是红色组成的的信息。
颜色空间的转换都用到了如下约定:
8位图像值的范围是[0,255]。
16位图像值的范围是[0,65 535]。
浮点数图像值的范围是[0.0~1.0]。

img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rat=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("img=\n",img)
print("rat=\n",rat)
print("img[1,0,0]=",img[1,0,0])
print("img[1,0,1]=",img[1,0,1])
print("img[1,0,2]=",img[1,0,2])
print("像素点(1,0),直接计算得到的值=",
        img[1,0,0]*0.114+img[1,0,1]*0.587+img[1,0,2]*0.299)
print("像素点(1,0)使用公式cv2.cvtColor()转换值=",rat[1,0])
img1=cv2.cvtColor(rat,cv2.COLOR_GRAY2BGR)
print("img1[1,0,0]=",img1[1,0,0])
print("img2[1,0,1]=",img1[1,0,1])
print("img3[1,0,2]=",img1[1,0,2])
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
bgr=cv2.cvtColor(rgb,cv2.COLOR_RGB2BGR)
print("rgb=\n",rgb)
print("bgr=\n",bgr)

标记指定颜色

通过inRange函数锁定特定值

OpenCV中通过函数cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其语法格式为:
dst=cv2.inRange(src,lowerb,upperb
式中:
dst表示输出结果,大小和src一样
src表示要检查的数组或者图像
lowerb表示范围下界
upperb表示范围上界
返回值dst和src等大小,其值取决于src中对应位置上 的值是否在处于区间[lowerb,upperb]内。
如果src值处于该区间内,则dst对应位置上的值为255
如果src值不处于该区间内,则dst对应位置上的值为0

img=np.random.randint(0,256,size=[5,5],dtype=np.uint8)
min=100
max=200
mask=cv2.inRange(img,min,max)
print("img=\n",img)
print("mask=\n",mask)

alpha通道

在RGB色彩空间三个通道的基础上,还可以加上一个A通道,也叫alpha通道,表示透明度。这种4个通道的色彩空间被称为RGBA色彩空间,PNG图像是一种典型的4通道图像,alpha通道的赋值范围是[0,1],或者[0,255],表示从透明到不透明。

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小菜花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值