OpenCV轻松入门:面向Python
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.2 类型转换函数

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

      dst = cv2.cvtColor( src, code [, dstCn] )

式中:

● dst表示输出图像,与原始输入图像具有同样的数据类型和深度。

● src表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。

● code是色彩空间转换码,表4-2展示了其枚举值。

● dstCn是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。

表4-2 枚举值

续表

续表

续表

续表

续表

这里需要注意,BGR色彩空间与传统的RGB色彩空间不同。对于一个标准的24位位图, BGR色彩空间中第1个8位(第1个字节)存储的是蓝色组成信息(Blue component),第2个8位(第2个字节)存储的是绿色组成信息(Green component),第3个8位(第3个字节)存储的是红色组成信息(Red component)。同样,其第4个、第5个、第6个字节分别存储蓝色、绿色、红色组成信息,以此类推。

颜色空间的转换都用到了如下约定:

● 8位图像值的范围是[0,255]。

● 16位图像值的范围是[0,65 535]。

● 浮点数图像值的范围是[0.0~1.0]。

对于线性转换来说,这些取值范围是无关紧要的。但是对于非线性转换来说,输入的RGB图像必须归一化到其对应的取值范围内,才能获取正确的转换结果。

例如,对于8位图,其能够表示的灰度级有28=256个,也就是说,在8位图中,最多能表示256个状态,通常是[0,255]之间的值。但是,在很多色彩空间中,值的范围并不恰好在[0,255]范围内,这时,就需要将该值映射到[0,255]内。

例如,在HSV或HLS色彩空间中,色调值通常在[0,360)范围内,在8位图中转换到上述色彩空间后,色调值要除以2,让其值范围变为[0,180),以满足存储范围,即让值的分布位于8位图能够表示的范围[0,255]内。又例如,在CIEL*a*b*色彩空间中,a通道和b通道的值范围是[-127,127],为了使其适应[0,255]的范围,每个值都要加上127。不过需要注意,由于计算过程存在四舍五入,所以转换过程并不是精准可逆的。