- OpenCV轻松入门:面向Python
- 李立宗
- 755字
- 2020-08-27 20:56:46
4.2 类型转换函数
在OpenCV内,我们使用cv2.cvtColor()函数实现色彩空间的变换。该函数能够实现多个色彩空间之间的转换。其语法格式为:
dst = cv2.cvtColor( src, code [, dstCn] )
式中:
● dst表示输出图像,与原始输入图像具有同样的数据类型和深度。
● src表示原始输入图像。可以是8位无符号图像、16位无符号图像,或者单精度浮点数等。
● code是色彩空间转换码,表4-2展示了其枚举值。
● dstCn是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。
表4-2 枚举值
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0100-0138.jpg?sign=1739482370-U5tYsuijX8GWWuSVnOZimLm2qzUCApRS-0-c2046b765a67e897ddcf352668921972)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0101-0139.jpg?sign=1739482370-DB1FwhTdqNytwUFWZ90KHod29CTW5osA-0-32afc2a102fc66458a6fb2273a2616c2)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0102-0140.jpg?sign=1739482370-QSVzhqgm4T6EJknp4ovqIoxmtBIiTbYk-0-f7afa7b400539c8534819cbe6dba82f5)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0103-0141.jpg?sign=1739482370-tjkha0N3znDJSkRrV7EAsmoMApDWUQsn-0-91d3f41e88fbd758afb98ae74de13156)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0104-0142.jpg?sign=1739482370-5URd8DL7DJBsqvmcC6NIE4xHuyhWiNDV-0-597f47bef99b5077cc82e556b1d89419)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0105-0143.jpg?sign=1739482370-y7BNfCK3p9wi4AngxB9rN1L32vHKkXwp-0-e8040f2f7ff0e77fcf901fd39709bf2c)
这里需要注意,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。不过需要注意,由于计算过程存在四舍五入,所以转换过程并不是精准可逆的。