python下:用 matplotlib.pyplot 显示 Opencv 读取的图像

在涉及图像处理时,我们通常用opencv去读取并处理图像,而用matplotlib去显示图像,因为opencv有很强的图像处理能力,而matplotlib有很强的可视化能力,可以方便的可视化分析实验的过程与结果。

但是,我们不能直接用matplotlib去显示opencv读取的图像,因为这样会造成图像的颜色失真。原因是:opencv读取的图像的通道顺序是[B,G,R],而matplotlib显示图像时图像的通道顺序是[R,G,B]。

用matplotlib直接显示opencv读取的图像,示例:

import matplotlib.pyplot as plt
import cv2

img = cv2.imread("./lena.jpeg")
plt.imshow(img)
plt.show()

上图左图是lena.jpeg原图,右图是用matplotlib显示opencv读取的图像的效果。可见在颜色上有很大改变。在试验中不利于我们进行分析。

为解决这个问题有以下三种方法:

第一种方式,利用cv2的merge函数手动去合并。

import matplotlib.pyplot as plt
import cv2
	
img = cv2.imread("./lena.jpeg")
b, g, r = cv2.split(img)
img = cv2.merge([r, g, b])
plt.imshow(img)
	
plt.show()

即先把它划分成bgr的形式,再把它合并成RGB,得到适宜用plt表示的变量img2。

第二种方式,利用cv2提供的BGR2RGB函数:

import matplotlib.pyplot as plt
import cv2
	
img = cv2.imread("./lena.jpeg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
	
plt.show()

这种方式是opencv对调颜色通道的函数,可以直接调用,比较方便。

第三种方式,利用矩阵的翻转。因为图像本身就是一个矩阵,所以可以直接利用矩阵操作实现图像通道的变换。恰好opencv的[B,G,R] 与matplotlib的[R,G,B]刚好是逆序,所以可以很方便的利用矩阵的逆序操作。具体如下:

import matplotlib.pyplot as plt
import cv2

img = cv2.imread("./lena.jpeg")
img = img[:,:,::-1]
plt.imshow(img)
	
plt.show()

 只需要在图像数据的channel维度进行[::-1]逆排序即可。[::-1]是一个切片操作,其标准格式是 [start:end:step],如果不指定,那么就默认start是0,end是该维度的大小,step是步长=1。

因此,对于img=img[:,:,::-1],意思则是对图像的长宽不做调整,仅仅调整通道。对通道的切片操作为[::-1]。

我们着重来看下,start没给,end没给,给了一个步长是-1。步长是负数代表你这是想要倒着走。切片内部自动把end和start调换了,原先通道是BGR,倒着走变成了RGB。通过这种方式实现对通道的翻转。

个人人为:方法3最方便,因为不用再调用opencv。因为,有时候图像的shape并不仅仅有[h,w,c]这三个维度,在这种情况下用opencv进行处理就很不方便。

一段时间后,个人认为方法2最好,因为这是遇到问题后首先想起来的办法。

参考:Opencv与matplotlib在python下读入图片的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值