图像处理-opencv中RGB与BGR通道
基于Python的OpenCV中RGB与BGR图片格式转换
我们在使用OpenCV时,经常需要将处理过的图片展示出来,由于OpenCV中显示图片的函数cv2.imshow()功能往往不能满足我们的需求,所以经常用Matplotlib显示图像,方便结果图片的放大、保存等操作。
但是,OpenCV和Matplotlib中图片的像素排列方式略有不同。OpenCV中图片像素按照BGR方式排列,而Matpoltlib中图片按照RGB方式排序,这样使用OpenCV读入的图片经过Matplotlib展示时,就会出现反相问题。
这里使用OpenCV的logo作为实验对象:
Figure 1: OpenCV Logo
1img = cv.imread("logo.png")#使用OpenCV读入图像
2plt.subplot(111);plt.imshow(img);plt.title("Original")#使用matplotliob展示图片
python
Figure 2: OpenCV Logo
与原图相比,上图的红色部分与蓝色部分交换了位置,意思是图片中红色像素和蓝色像素排列位置做了交换,印证了读入的BGR格式经过Matplotlib展示后变成了RGB格式。而且绿色的部分也有明显的色差。
要想正确的显示图片,必须先把读入的BGR图片中的B通道和R通道交换位置。这里有两种可行的方法可以实现BGR TO RGB操作。
方法1:先拆分通道B、G、R,再合并通道R、G、B
在拆分通道时,除了使用OpenCV的split()方法,还可以用Numpy的索引:
在Matplotlib中显示:
1plt.subplot(111);plt.imshow(img);plt.title("Original")
2plt.subplot(122);plt.imshow(img_1);plt.title("Display_RGB")
python
Figure 3: opencv logo rgb bgr
在第二幅图片中,可以看到展示结果与原图一致。
方法2:直接使用Numpy索引
我们都知道Numpy在计算这种大型矩阵时,索引的效率很高,所以下面的方法简单高效,及其推荐使用。
1img_2 = img[:,:,::-1]
2plt.subplot(131);plt.imshow(img);plt.title("Original")
3plt.subplot(132);plt.imshow(img_1);plt.title("Display_RGB")
4plt.subplot(133);plt.imshow(img_2);plt.title("Display_RGB")
5plt.show()
python
Figure 4: opencv logo brg to rgb
可以看出,后面两幅图片与OpenCV的logo图片一致,都能正确的显示结果,但方法2更简单、高效、容易理解。