欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-19 22:20:51
...

在涉及图像处理时,我们通常用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()

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

上图左图是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进行处理就很不方便。

 

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