GRAY(灰度图像)通常指8位灰度图,具有256的个灰度级,像素值的范围是[0,255]。当图像由RGB色彩空间转换为GRAY色彩空间时,处理方式如下:
GRAY=0.299*R+0.587*G+0.114*B
上述是标准转换方式,也是OpenCV中常用的转换方式,有时,也可以用简化形式:
Gray=(R+G+B)/3
XYZ色彩空间是一种更便于计算的色彩空间,它可以和RGB色彩空间相互转换。
RGB转XYZ:
XYZ转RGB:
在YCrCb色彩空间中,Y代表光源的亮度,色度信息保存在Cr和Cb中,其中,Cr表示红色分量信息,Cb表示蓝色分量信息。
RGB色彩空间到YCrCb色彩空间的转换公式:
Y=0.299*R+0.587*G+0.114*B
Cr=(R-Y)*0.713+delta
Cb=(B-Y)*0.564+delta
其中,delta的值为:
YCrCb色彩空间到RGB色彩空间的转换公式:
R=Y+1.403*(Cr-delta)
G=Y-0.714*(Cr-delta)-0.344*(Cb-delta)
B=Y+1.773*(Cb-delta)
其中,delta的值与上图相同。
HSV色彩空间是一种面向视觉感知的颜色模型,包含三要素:色调(色相),饱和度,亮度。色调指光的颜色,饱和度指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。下面介绍三要素的取值范围:
色调:我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色,色调的取值范围是[0,360]。
饱和度:表示所有颜色的纯度值和该颜色的最大纯度值之间的比值,取值为[0,1]。饱和度的值为0时,只有灰度。
亮度:表示色彩的明亮程度,取值范围也是[0,1]
需要注意的是,从RGB色彩空间转换到HSV色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再进行处理,具体转换方法为:
计算时可能出现H<0的情况,如果出现这种情况,需要对H进行进一步计算,如下:
HSV色彩空间到RGB色彩空间的转换公式,Opencv官方文档中有具体公式,在此不做赘述。
HLS色彩空间包含的三要素是色调H,光亮度/明度L,饱和度S。HLS与HSV色彩空间相似,只是在具体表示上,用“光亮度明度”代替了“亮度”。
CIEL*a*b*色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。
从视觉感知均匀空间的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。
CIEL*a*b*色彩空间中的L*分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;
a*分量表示从红色到绿色的范围,取值范围是[-127,127],b*分量表示从黄色到蓝色的范围,取值范围是[-127,127]。
需要注意的是,从RGB色彩空间转换到CIEL*a*b*色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再进行处理,具体转换方法为:
其中,
CIEL*u*v*色彩空间和CIEL*a*b*色彩空间一样,都是均匀的颜色模型,但CIEL*u*v*色彩空间对红色的变化比较敏感,但对蓝色的变化不太敏感。
RGB色彩空间到CIEL*u*v*色彩空间的转换公式:
先从RGB色彩空间转换到XYZ色彩空间:
再从RGB色彩空间到CIEL*u*v*色彩空间的转换公式:
Bayer色彩空间能从单平面R,G,B交错表内获得彩色图像
在OpenCV内,我们使用cv2.cvtColor()函数实现色彩空间的转换。该函数能实现多个色彩空间之间的转换,其语法格式为:
dst=cv2.cvtColor(src,code,[,dstCn])
#式中:
#dst表示输出图像,与原始输入图像具有同样的数据类型和深度
#src表示原始输入图像,可以是8位无符号图像,16位无符号图像,或者单精度浮点数等
#code是色彩空间转换码
#dstCn是目标图像的通道数,如果参数为默认的0,则通道数自动通过原始输入图像和code得到
# 将BGR图像转换为灰度图像
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])
运行结果:
# 将图像在BGR和RGB模式之间相互转化
import cv2
import numpy as np
img=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8)
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
bgr=cv2.cvtColor(rgb,cv2.COLOR_RGB2BGR)
print("img=\n",img)
print("rgb=\n",rgb)
print("bgr=\n",bgr)
运行结果:
# 将图像在BGR模式和灰度图像之间相互转换
import cv2
img=cv2.imread("moon.png")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
rgb=cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
# 打印shape
print("img.shape=",img.shape)
print("gray.shape=",gray.shape)
print("rgb.shape=",rgb.shape)
# 显示效果
cv2.imshow("img",img)
cv2.imshow("gray",gray)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destoryAllWindows()
运行结果:
# 将图像从BGR模式转换成RGB模式
import cv2
img=cv2.imread("moon.png")
rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
cv2.imshow("img",img)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destoryAllWindows()
运行结果: