cv2.imread和Image.open的差异

opencv的库cv2和PIL中的Image都可以用于读取和保存图片

import cv2
from PIL import Image
import matplotlib.pyplot as plt

img1=cv2.imread('dog.jpg')
img2=Image.open('dog.jpg')

此时读取同一张图片,img1是一个ndarray的数组,img2是PIL.JpegImagePlugin.JpegImageFile的对象,可以使用np.array(img2)转换为一个ndarray的数组。

而且cv2读入的图片是BGR格式的,而Image读入的图片是RBG格式。cv2.imshow()函数可以直接用于显示cv2读取的图片,而plt.imshow()则不能直接进行显示,下面两种方式都可以进行转换。

r, g, b = cv2.split(img1)
#以b,g,r分量重新生成新图像
img1_1 = cv2.merge([b,g,r])

#也可以通过自带函数
img1_2 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)

无论哪种方式读入的图片都是HxWxC(高X宽X通道),在卷积神经网络中,我们一般会把通道数放在前面即CxHxW,可以使用numpy的transpose()函数进行转化,

如果使用torchvision.transforms.ToTensor()可以自动帮我们完成转换。

import torchvision.transforms as transforms
import numpy as np

transform=transforms.ToTensor()
print(img1.shape)
print(np.transpose(img1,(2,0,1)).shape)
print(transform(img1).shape)

可得结果:

(576, 768, 3)

(3, 576, 768)

torch.Size([3, 576, 768])

所以在使用cv2读入图片时候进行BGR->RGB的转换,通道位置可以自己调用函数转换,也可以使用transform进行转换。

你可能感兴趣的:(opencv,计算机视觉,深度学习)