![OpenCV轻松入门:面向Python](https://wfqqreader-1252317822.image.myqcloud.com/cover/910/26297910/b_26297910.jpg)
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=1739975756-JZU1VTTueeGU2JjqnlfZeGfhoXQR3x6A-0-dfe198491e439da0310bc1bce3f4eadf)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0101-0139.jpg?sign=1739975756-5e1einEXy3qlDQTOFCZJAPpOyRLVoQgl-0-324e3cf84d2001f287fe1f40eff7f4e3)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0102-0140.jpg?sign=1739975756-VzhTUzK64pXvLvI642qnlzdSo2SWRAx4-0-e2b647d193b2fc3587ebea1fe36c3e7e)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0103-0141.jpg?sign=1739975756-b059yqazz59vbfzxBYpdSrGqzOEzCwUV-0-0321b1eaaa911d9f9554799f183cd9bb)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0104-0142.jpg?sign=1739975756-LljjEZwAML62ELA7ubJIFxv3rNX2f8dr-0-0bfa77cbeef9b7dd36c2dbf3fccff798)
续表
![](https://epubservercos.yuewen.com/53BA2F/14737439604468406/epubprivate/OEBPS/Images/Figure-0105-0143.jpg?sign=1739975756-BMKkUvoIKnRLNobLfNSJAz2RA7fzuO2a-0-ed409392f7428e8d4f41411aef42b570)
这里需要注意,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。不过需要注意,由于计算过程存在四舍五入,所以转换过程并不是精准可逆的。