python中图像的读取、存储与显示

主要讲一下关于图片的读取、显示以及保存,包括用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,或者是保存相同尺寸照片的list
  • nrow:每行显示照片的张数
  • 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) → Tensorpermute()很好理解,就是把原来的维度,按照新的顺序排列,它需要返回值。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中的任意两个维度的数据进行转换。

猜你喜欢

转载自blog.csdn.net/Huang_Fj/article/details/118225675
今日推荐