主要讲一下关于图片的读取、显示以及保存,包括用transform
预处理过的图片。(后来发现预处理过的图片没多大变化,不需要单独列出)
1、PIL中的Image类
可以利用PIL中的Image类来读取图片,Image
是一个类,它的常用方法有open()
,save()
,show()
,spilt()
和merge()
等。更多方法
from PIL import Image
import numpy as np
file_path = '/home/fj/Pictures/85mm'
img = Image.open(file_path)
该方法读取出来的就是一个Image
类,可以直接调用上述方法,img.show()
显示图片,img.save(outfile)
将图片保存到对应路径,r,g,b = im.split()
将Mode=RGB
的图像分开,得到的结果其类型依旧是Image
类,但是其Mode=L
。同样我们可以利用merge()
将三个Mode=L
的灰度图合成彩色图片new_im = Image.merge("RGB",(r,g,b))
Image
类可以和numpy
中的矩阵相互转化,转化后的im_data
的数据类型为unit8
,也就是标准的图片数据类型0~255,其形状是(length,width,3)
,需要注意的是3在最后一维。
im_data = np.array(img)
img_from_array = Image.fromarray(im_data)
2、matplotlib工具包
利用matplotlib.pyplot
这个工具包来进行读取、显示和保存。它是matlab里用于读写图片的一个工具包,使用的也比较多。既可以显示unit8
类型的0~255的数据,可以显示float
类型的0~1的数据。
import matplotlib.pyplot as plt
img = plt.imread(file_path) #(length,width,3)
plt.imshow(img) # plt.imshow(img/255)结果一样
plt.show()
注意plt.imshow(img)
以后不会直接显示图像,它后面还可以跟其他的操作,然后调用plt.show()
显示所有的操作。plt.imshow()
的输入数据有4类:
- PIL Image类:也就是PIL中得到Image可以直接作为
plt.imshow()
的参数,显示图片; - (M, N):数值数据的矩阵,可视化的时候利用了一个
colormap
,所以显示出现的不是灰度图; - (M, N, 3):RGB值的图像矩阵,可以是0~1浮点类型或者0~255的整型;
- (M, N, 4):RGBA值的图像矩阵,可以是0~1浮点类型或者0~255的整型,其中A代表透明度。
plt.imshow()
还有许多其他的输入参数,可以用help查看。利用plt.imsave(fname,arr)
可以将arr
矩阵保存在fname
文件中。同时plt.savefig()
还可以保存任何 matplotlib 画出的图像,相当于一个 screencapture。
3、pytorch中的torchvision.utils.save_image
pytorch中也提供了一个保存图片的方式,它将Tensor直接存储为图片,就是torchvision.utils中的save_image
,它一般配合其中的make_grid
(构造x轴)和torch.cat
(构造y轴)使用。
make_grid(tensor, nrow: int = 8, normalize: bool = False, range: Optional[Tuple[int, int]] = None) → torch.Tensor
tensor
:(B x C x H x W)
形状的Tensor,或者是保存相同尺寸照片的listnrow
:每行显示照片的张数normalize
:是否将tensor中的数据归一化,默认为(0,1)range
:归一化到range指定的范围
save_image(tensor,fp)
可以将make_grid
建立的grid保存,其参数多了一个保存路径fp
。
4、神经网络中Tensor的维度转换
在神经网络中数据的结构是(B,C,H,W)
,而上述的PIL和plt方法所需要的都是(H,W,C)
类型,所以这里需要一个转换,可以用pytorch中的方法,也可以用numpy中的方法。
Tensor.permute()
:permute(*dims) → Tensor
,permute()
很好理解,就是把原来的维度,按照新的顺序排列,它需要返回值。permute_()
可以in_plece的将Tensor转换,没有返回值。
import torch
img = torch.randn([3,256,256])
print(img.shape) # (3,256,256)
new_img = img.permute(1,2,0)
print(new_img.shape) # (256,256,3)
-
torch.transpose(input,dim0,dim1)
:适用于转化2为的矩阵。 -
arr.T
:这是numpy中的方法,适用于一维或者二维的矩阵,有返回值。 -
arr.transpose()
:该方法与Tensor.permute()
类似,其参数数量等于arr
的维度,需要有返回值。 -
arr.swapaxes(a, axis1, axis2)
:该方法可以将a
中的任意两个维度的数据进行转换。