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

话不多说,先看代码段:

import cv2
from matplotlib import pyplot as plt
img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR)
plt.imshow(img)
plt.show()

这样读图片多半显示出来的img图片的效果多半是有问题的,原本发红的lena会变得发蓝。这是因为cv2读取图片时,默认的顺序是BGR顺序,而matplotlib用的是RGB方式。也就是说,发红的lena图片读入img后,第三个通道内的数据(也就是红色通道)的数值在plt.imshow的时候,被按照B的方式(也就是蓝色)的方式读了出来,因此图像会偏蓝。

那么如何处理此问题呢?

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

b,g,r=cv2.split(img)
img2=cv2.merge([r,g,b])
plt.imshow(img2)
plt.show()

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

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

img3=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img3)
plt.show()

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

第三种方式,翻转numpy矩阵。这种做法不太直观,平时建议不要这么使用。但是很有学习的必要,因为对于矩阵操作的时候,进行翻转是很常见的。因此有必要学习下:

img4=img[:,:,::-1]
plt.imshow(img4)
plt.show()

这是numpy矩阵中的切片一节的内容。对于数组的切片,不管是几维的,每一维的切片也就这样的形式:

[start:end:step]

如果不指定,那么就默认start是0,end是该维度的大小,step是步长=1。

例如,b=a[:,2:8:2]就代表a是一个二维数组,第一维依旧保持,在第二维上进行切片,从2到8,每隔2个数(包括)选取一个点。

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

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

你可能感兴趣的:(神经网络笔记,Python与C++笔记)