OpenCV中,有很多色彩类型。可以使用cv2.cvtColor()函数实现色彩空间的转换。

关于色彩空间的理论介绍,请见:Opencv For Python入门11_色彩空间基础_GRAY色彩空间、XYZ色彩空间等

类型转换函数的用法

dst = cv2.cvtColor(src, code [, dstCn])
  • dst表示输出图像,与原始输入图像具有相同的数据类型和深度
  • src表示原始输入图像。可以是8位无符号图像,16位无符号图像,或者单精度浮点数等
  • code是色彩空间转码,具体的参数值请见后面附表
  • dstCn是目标图像的通道数,默认参数为0,通道数自动通过原始输入图像和code得到

注意:BGR与RGB 是不同的,约定,8位图像值的范围[0,255] 16位图像值[0,65535] ,浮点数图像值[0.0,1.0]。

例如,8位图中,值的范围[0,255],当色彩空间的值不在这个范围时,就要将该值映射到范围内。在HSV HLS中,色调[0,360),转到灰度时,色调就要除以2,[0,180). 在CIELab* 中,a,b通道的范围[-127,127] ,需要加上127.。由于计算中的四舍五入,转换过程并不都是精准可逆的。

类型转换实例

例1 由数组观察转化效果

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)

结果:

img=
[[[159 179 210]
[ 14 110 113]
[ 19 135 202]
[229 224 140]]

[[196 132 221]
[ 66 151 126]
[171 112 147]
[218 66 239]]]
rst=
[[186 100 142 199]
[166 134 129 135]]

就拿左上角第一个来分析:

$$
\begin{eqnarray}Gray & = & 0.299Red + 0.587Green+0.114Blue \end{eqnarray}
$$
0.299X210 + 0.587X179 + 0.114X159 = 185.989 ,约等于186

上面的计算需要注意RGB通道的顺序。

例2 将灰度图转换为RGB

import cv2
import numpy as np
img = np.random.randint(0, 256, size=[2, 4], dtype=np.uint8)
rst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
print('img=\n', img)
print('rst=\n', rst)

结果

img=
[[127 123 231 170]
[138 218 55 186]]
rst=
[[[127 127 127]
[123 123 123]
[231 231 231]
[170 170 170]]

[[138 138 138]
[218 218 218]
[ 55 55 55]
[186 186 186]]]

正好验证了前面的这个理论部分

例3 将一个图像在BGR模式和灰度图之间相互转换。

import cv2
img = cv2.imread('C:/Users/Administrator/Desktop/Blog/Opencv/baidu.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
print('img.shape=\n', img.shape)
print('GRAY.shape=\n', gray.shape)
print('rgb.shape=\n', rgb.shape)
cv2.imshow('img', img)
cv2.imshow('gray', gray)
cv2.imshow('rgb', rgb)
cv2.waitKey()

运行:

img.shape=
(258, 540, 3)
GRAY.shape=
(258, 540)
rgb.shape=
(258, 540, 3)

运行后的显示效果

回答上面的问题:为什么RGB还是灰色?

答:通过cv2.COLOR_GRAY2BGR获得的RGB图像中,B、G、R的值都是一样的,看起来仍是灰度图,但是通过rgb.shape看的出来结果是 (258, 540, 3)。可以在下面的在线RGB调色板来验证当R=G=B时候的样子。

在线RGB调色板

例4 将图像从BGR模式转换为RGB模式

import cv2
img_bgr = cv2.imread('C:/Users/Administrator/Desktop/Blog/Opencv/baidu.png')
rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
cv2.imshow('img_bgr', img_bgr)
cv2.imshow('rgb', rgb)
cv2.waitKey()

从结果图中不难看出来,正好红色的和蓝色的调过来了。

运行的效果图

素材

baidu

附表

枚举值第一部分

枚举值第二部分

枚举值第三部分

枚举值第四部分

枚举值第五部分

枚举值第六部分


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2021/opencv12.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏