图像处理-opencv中RGB与BGR通道

基于Python的OpenCV中RGB与BGR图片格式转换

我们在使用OpenCV时,经常需要将处理过的图片展示出来,由于OpenCV中显示图片的函数cv2.imshow()功能往往不能满足我们的需求,所以经常用Matplotlib显示图像,方便结果图片的放大、保存等操作。

但是,OpenCV和Matplotlib中图片的像素排列方式略有不同。OpenCV中图片像素按照BGR方式排列,而Matpoltlib中图片按照RGB方式排序,这样使用OpenCV读入的图片经过Matplotlib展示时,就会出现反相问题。

这里使用OpenCV的logo作为实验对象:

OpenCV Logo

1img = cv.imread("logo.png")#使用OpenCV读入图像
2plt.subplot(111);plt.imshow(img);plt.title("Original")#使用matplotliob展示图片

OpenCV Logo

与原图相比,上图的红色部分与蓝色部分交换了位置,意思是图片中红色像素和蓝色像素排列位置做了交换,印证了读入的BGR格式经过Matplotlib展示后变成了RGB格式。而且绿色的部分也有明显的色差。

要想正确的显示图片,必须先把读入的BGR图片中的B通道和R通道交换位置。这里有两种可行的方法可以实现BGR TO RGB操作。

方法1:先拆分通道B、G、R,再合并通道R、G、B

1b,g,r = cv.split(img)#拆分通道
2img_1 = cv.merge([r,g,b])#合并通道

在拆分通道时,除了使用OpenCV的split()方法,还可以用Numpy的索引:

1b = image[:,:,0]#得到蓝色通道
2g = image[:,:,1]#得到绿色通道
3r = image[:,:,2]#得到红色通道

在Matplotlib中显示:

1plt.subplot(111);plt.imshow(img);plt.title("Original")
2plt.subplot(122);plt.imshow(img_1);plt.title("Display_RGB")

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()

opencv logo brg to rgb

可以看出,后面两幅图片与OpenCV的logo图片一致,都能正确的显示结果,但方法2更简单、高效、容易理解。