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进行转换。
|