图像处理-opencv中RGB与BGR通道 Jan 7, 2020 · 图像处理 · 分享到: 基于Python的OpenCV中RGB与BGR图片格式转换 我们在使用OpenCV时,经常需要将处理过的图片展示出来,由于OpenCV中显示图片的函数cv2.imshow()功能往往不能满足我们的需求,所以经常用Matplotlib显示图像,方便结果图片的放大、保存等操作。 但是,OpenCV和Matplotlib中图片的像素排列方式略有不同。OpenCV中图片像素按照BGR方式排列,而Matpoltlib中图片按照RGB方式排序,这样使用OpenCV读入的图片经过Matplotlib展示时,就会出现反相问题。 这里使用OpenCV的logo作为实验对象: 1img = cv.imread("logo.png")#使用OpenCV读入图像 2plt.subplot(111);plt.imshow(img);plt.title("Original")#使用matplotliob展示图片 与原图相比,上图的红色部分与蓝色部分交换了位置,意思是图片中红色像素和蓝色像素排列位置做了交换,印证了读入的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") 在第二幅图片中,可以看到展示结果与原图一致。 方法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图片一致,都能正确的显示结果,但方法2更简单、高效、容易理解。