> 文章列表 > Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)

Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)

Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)

一,色彩空间分类

1.GRAY色彩空间

GRAY(灰度图像)通常指8位灰度图,具有256的个灰度级,像素值的范围是[0,255]。当图像由RGB色彩空间转换为GRAY色彩空间时,处理方式如下:

GRAY=0.299*R+0.587*G+0.114*B

上述是标准转换方式,也是OpenCV中常用的转换方式,有时,也可以用简化形式:

Gray=(R+G+B)/3

2.XYZ色彩空间

XYZ色彩空间是一种更便于计算的色彩空间,它可以和RGB色彩空间相互转换。

RGB转XYZ:

XYZ转RGB:

3.YCrCb色彩空间

在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的值与上图相同。

4.HSV色彩空间

HSV色彩空间是一种面向视觉感知的颜色模型,包含三要素:色调(色相),饱和度,亮度。色调指光的颜色,饱和度指色彩的深浅程度,亮度指人眼感受到的光的明暗程度。下面介绍三要素的取值范围:

色调:我们将物理空间的颜色分布在圆周上,不同的角度代表不同的颜色,色调的取值范围是[0,360]。

饱和度:表示所有颜色的纯度值和该颜色的最大纯度值之间的比值,取值为[0,1]。饱和度的值为0时,只有灰度。

亮度:表示色彩的明亮程度,取值范围也是[0,1]

需要注意的是,从RGB色彩空间转换到HSV色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再进行处理,具体转换方法为:

计算时可能出现H<0的情况,如果出现这种情况,需要对H进行进一步计算,如下:

HSV色彩空间到RGB色彩空间的转换公式,Opencv官方文档中有具体公式,在此不做赘述。

5.HLS色彩空间

HLS色彩空间包含的三要素是色调H,光亮度/明度L,饱和度S。HLS与HSV色彩空间相似,只是在具体表示上,用“光亮度明度”代替了“亮度”。

6.CIEL*a*b*色彩空间

CIEL*a*b*色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。

从视觉感知均匀空间的角度来讲,人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间

CIEL*a*b*色彩空间中的L*分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;

a*分量表示从红色到绿色的范围,取值范围是[-127,127],b*分量表示从黄色到蓝色的范围,取值范围是[-127,127]。

需要注意的是,从RGB色彩空间转换到CIEL*a*b*色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再进行处理,具体转换方法为:

其中,

7.CIEL*u*v*色彩空间

CIEL*u*v*色彩空间和CIEL*a*b*色彩空间一样,都是均匀的颜色模型,但CIEL*u*v*色彩空间对红色的变化比较敏感,但对蓝色的变化不太敏感。

RGB色彩空间到CIEL*u*v*色彩空间的转换公式:

先从RGB色彩空间转换到XYZ色彩空间:

再从RGB色彩空间到CIEL*u*v*色彩空间的转换公式:

8.Bayer色彩空间

Bayer色彩空间能从单平面R,G,B交错表内获得彩色图像

Bayer色彩空间交错表

二,类型转换实例

1.类型转换函数

在OpenCV内,我们使用cv2.cvtColor()函数实现色彩空间的转换。该函数能实现多个色彩空间之间的转换,其语法格式为:

dst=cv2.cvtColor(src,code,[,dstCn])
#式中:
#dst表示输出图像,与原始输入图像具有同样的数据类型和深度
#src表示原始输入图像,可以是8位无符号图像,16位无符号图像,或者单精度浮点数等
#code是色彩空间转换码
#dstCn是目标图像的通道数,如果参数为默认的0,则通道数自动通过原始输入图像和code得到

2.通过数组观察转换效果

# 将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])

运行结果:

Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)
# 将图像在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)

运行结果:

Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)

3.图像处理示例

# 将图像在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()

运行结果:

Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)
Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)
# 将图像从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()

运行结果:

Opencv+Python学习记录12:色彩空间类型转换(内附详细代码)

rgb版有种邪典的感觉...emm