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

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

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

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

img = cv.imread("logo.png")#使用OpenCV读入图像

plt.subplot(111);plt.imshow(img);plt.title("Original")#使用matplotliob展示图片

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

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

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

b,g,r = cv.split(img)#拆分通道

img_1 = cv.merge([r,g,b])#合并通道

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

b = image[:,:,0]#得到蓝色通道

g = image[:,:,1]#得到绿色通道

r = image[:,:,2]#得到红色通道

在Matplotlib中显示:

plt.subplot(111);plt.imshow(img);plt.title("Original")

plt.subplot(122);plt.imshow(img_1);plt.title("Display_RGB")

在第二幅图片中,可以看到展示结果与原图一致。

方法2:直接使用Numpy索引

我们都知道Numpy在计算这种大型矩阵时,索引的效率很高,所以下面的方法简单高效,及其推荐使用。

img_2 = img[:,:,::-1]

plt.subplot(131);plt.imshow(img);plt.title("Original")

plt.subplot(132);plt.imshow(img_1);plt.title("Display_RGB")

plt.subplot(133);plt.imshow(img_2);plt.title("Display_RGB")

plt.show()

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值