OpenCV中提供cvtColor()函数来进行色彩空间的转换。色彩空间种类较多,经常用到的有:RGB空间,HSI空间,Gray灰度空间,带alpha通道的RGB等等。需要注意的是OpenCV中所处理的RGB三通道的顺序为B,G,R。
- RGB转Gray
转换关系为Gray = B * 0.114 + G * 0.587 + R * 0.299
在前面说过,图像运算其本质上就是一个个的数组运算,用数组来测试cvtColor函数与转换公式之间的关系。需要注意的是在定义矩阵时,尺寸定义为[2,4,3]也就是三通道。在使用时对应位置的取值范围分别为0~1,0~3,0~2。img[1,0,0]表示第二个矩阵中第0行第0列;img[1,0,1]表示第二个矩阵中第0行第1列。演示如下
Code:
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])
- Gray转RGB
Gray图是一维的,只包含一个通道,想转换成RGB空间只能是将单通道的数据复制到三个通道中去。下图两个矩阵,img是随机生成的矩阵,rst是将灰度转换成RGB空间中后的结果。
Code:
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)
灰度和RGB空间相互转换的实例:
下面第一幅图是原来图,经过转换灰度后效果如标题Gray图所示。再通过Gray转换到RGB空间当中时,已经没有了原来的色彩,这是因为在RGB转换到灰度空间时信息已经丢失了。
- BGR转RGB
OpenCV中提供cvtColor()函数用于RGB与BGR之间的转换。在矩阵当中就是将第一列和第三列互换了一下。转换代码及结果如下:
Code:
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)
下图正常色彩使用的是BGR,在转换成RGB时原图像中蓝色系(头发)变成红色,红色系(背景)变成蓝色。这是因为OpenCV中通道顺序是B,G,R。使用RGB就是将红色通道的值都放到了蓝色通道当中,造成了颜色的互换。
- RGB转HSV
HSV也可以写做HSI,仅仅是名称有所不同,所描述的色彩空间都是一样的。
其中H(Hue代表色调),S(Saturation代表饱和度),I(Intensity代表亮度)在遥感图像处理中,可以将I,换做其他相同区域经过几何校正的更高分辨率的灰度图像进行融合,在转换到RGB空间时可以在不损失其他信息的情况下,大幅提高分辨率。
下面的示例当中仅针对纯色蓝,绿,红进行RGB到HSV空间中的转换。OpenCV中的 H分量是 0~180, S分量是0~255, V分量是0~255,而实际上HSV颜色空间H范围0~360,S范围0~1,V范围0~1,所以在使用的时候还需要自己转换一下,H*2,V/255,S/255。
Code:
以蓝色为例
#先给定一个纯蓝色
imgBlue[0,0,0]=255
Blue=imgBlue
BlueHSV=cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)
print("Blue=\n",Blue)
print("BlueHSV=\n",BlueHSV)
如果有什么疑问,欢迎在评论区或私信讨论呦(*^_^*)