OpenCV中提供cvtColor()函数来进行色彩空间的转换。色彩空间种类较多,经常用到的有:RGB空间,HSI空间,Gray灰度空间,带alpha通道的RGB等等。需要注意的是OpenCV中所处理的RGB三通道的顺序为B,G,R。

  1. 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列。演示如下

                                                                                             

opencv颜色过滤 opencv颜色空间转换_opencv

                                         

opencv颜色过滤 opencv颜色空间转换_灰度_02

                                                                                                                            

opencv颜色过滤 opencv颜色空间转换_灰度_03

 

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])
  1. Gray转RGB

Gray图是一维的,只包含一个通道,想转换成RGB空间只能是将单通道的数据复制到三个通道中去。下图两个矩阵,img是随机生成的矩阵,rst是将灰度转换成RGB空间中后的结果。

 

                                                                                                   

opencv颜色过滤 opencv颜色空间转换_opencv_04

           

opencv颜色过滤 opencv颜色空间转换_灰度_05

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转换到灰度空间时信息已经丢失了。

                                                                   

opencv颜色过滤 opencv颜色空间转换_灰度_06

       

opencv颜色过滤 opencv颜色空间转换_灰度_07

         

opencv颜色过滤 opencv颜色空间转换_opencv_08

 

  1. BGR转RGB

OpenCV中提供cvtColor()函数用于RGB与BGR之间的转换。在矩阵当中就是将第一列和第三列互换了一下。转换代码及结果如下:

                                                                                           

opencv颜色过滤 opencv颜色空间转换_灰度_09

    

opencv颜色过滤 opencv颜色空间转换_计算机视觉_10

    

opencv颜色过滤 opencv颜色空间转换_opencv颜色过滤_11

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就是将红色通道的值都放到了蓝色通道当中,造成了颜色的互换。

                                                                                   

opencv颜色过滤 opencv颜色空间转换_opencv颜色过滤_12

       

opencv颜色过滤 opencv颜色空间转换_python_13

 

  1. 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。

                                                                    

opencv颜色过滤 opencv颜色空间转换_opencv_14

       

opencv颜色过滤 opencv颜色空间转换_灰度_15

      

opencv颜色过滤 opencv颜色空间转换_opencv颜色过滤_16

Code:

以蓝色为例

#先给定一个纯蓝色

imgBlue[0,0,0]=255

Blue=imgBlue

BlueHSV=cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)

print("Blue=\n",Blue)

print("BlueHSV=\n",BlueHSV)

                                                                                                                                                                                                                              如果有什么疑问,欢迎在评论区或私信讨论呦(*^_^*)