色彩空间类型转换
每个色彩空间都有自己擅长的处理问题的领域,为了方便的处理某个具体的问题,就要使用色彩空间的转换。例如,进行图像的特征提取,距离计算时,通常将RGB转换成灰度色彩空间。
GRAY色彩空间
GRAY(灰度图像)通常指8位灰度图,有255个灰度级,范围是 0-255 . RGB转GRAY 公式为Gray = 0.299 · 𝑅 + 0.587 · 𝐺 + 0.114 · B
. GRAY转RGB 时,R=G=B=Gray
XYZ色彩空间
这是一种更加方便计算的色彩空间。
YCrCb色彩空间
人眼视觉系统对颜色的敏感度要低于对亮度的敏感度。在RGB中,忽略了亮度信息。在 ycrcb中,Y表示光源亮度,色度信息保存在Cr Cb 中,Cr为红色分量信息,Cb表示蓝色分量信息。
HSV色彩空间
HSV 是一种面向视觉感知的颜色模型,色调(光的颜色),饱和度(颜色的深浅,与白色混合的数量),亮度(明暗程度)。色调使用色调环表示【0-360】,亮度,饱和度的范围[0-1] 。
在RGB转HSV之前,需要将RGB的值转换到 [0-1] 之间
通常都是使用 cv2.cvtColor() 函数来转换,这里看看原理嘛。。。
HLS色彩空间
H色调,L光亮度/明度(不是亮度,取值也是 [0-1] ),S饱和度。
CIEL*a*b* 色彩空间
这个是均匀色彩空间,面向视觉感知的颜色模型。从视觉感知均匀的角度来讲,人所感知的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。如果人观察到的两种颜色的区别程度,与这两种颜色在该色彩空间中对应点的欧氏距离成正比,则称均匀色彩空间。
CIELab* 中 L* 表示像数亮度[0-100] ,表示纯黑到纯白。a* 表示从红色到绿色的范围[-127-127] ,b*黄色到蓝色的范围 [-127-127].
这个是在XYZ色彩空间上发展来的,所以要先转换成 XYZ。
呵呵,我是不会看第二遍的。。。
CIEL*u*v*色彩空间
也是均匀的颜色模型。适用于显示器显示和根据加色原理进行组合的场合。
Bayer 色彩空间
广泛运用在CCD CMOS相机中。。。可以从单平面R,G,B 交错表内获取彩色图像。
痴呆日记。。。。。
类型转换函数
使用cv2.cvtColor() 函数实现色彩空间的变换,该函数可以实现多个色彩空间之间的转换。
dst=cv2.cvtColor( src, code ,[dstCn] )
src表示原图,code是色彩空间转换码,dstCn 是目标图像的通道数,默认0,通道自动通过原图和code 获得。
code 太多了,,就贴在后面吧。。
注意:BGR与RGB 是不同的,约定,8位图像值的范围[0,255] 16位图像值[0,65535] ,浮点数图像值[0.0,1.0]。
例如,8位图中,值的范围[0,255],当色彩空间的值不在这个范围时,就要将该值映射到范围内。在HSV HLS中,色调[0,360),转到灰度时,色调就要除以2,[0,180). 在CIELab* 中,a,b通道的范围[-127,127] ,需要加上127.。由于计算中的四舍五入,转换过程并不都是精准可逆的。
import cv2
import numpy as np
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rst=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print("img=\n",img)
print("rst=\n",rst)
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()转换值=",rst[1,0])
img=
[[[166 97 102]
[ 73 31 51]
[221 94 158]
[143 101 172]]
[[ 96 140 92]
[ 19 156 34]
[ 16 113 202]
[116 236 238]]]
rst=
[[106 42 128 127]
[121 104 129 223]]
像素点(1,0)直接计算得到的值= 120.63199999999999 # 结果的一堆小数四舍五入转换到灰度图的值范围。
像素点(1,0)使用公式 cv2.cvtColor()转换值= 121
BGR图像的存储方式,感觉坐标轴 x向前,y向上,z向右。
lena=cv2.imread("lenacolor.png")
rgb = cv2.cvtColor(lena, cv2.COLOR_BGR2RGB)
cv2.imshow("lena",lena)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destroyAllWindows()