pytorch中图片相关注意的问题

问题:

将数据集读取到网络中,进行训练(转为了tensor),最后想要转回原始图像,并对图片进行保存时,遇到了一些问题:

备注:形状为3,256,256的PyTorch张量,其中3是通道数,图像尺寸是256,浮点值。

image = image.squeeze(0)  # {1,3,256,256}->{3,256,256}
image = image.to("cpu").numpy().astype(np.uint8)  # tensor转numpy
image = Image.fromarray(image)  # numpy转PIL
image.convert('RGB')

报错:

在 “ image = Image.fromarray(image)  ”这里会报错:

  • TypeError: Cannot handle this data type: (1, 1, 256), |u1

解决:

image = image.squeeze(0)
image = (255* image).to("cpu").numpy().astype(np.uint8)
image = Image.fromarray(image.transpose(1, 2, 0))
image.convert('RGB')

需要注意的是:

  • 原始image数据经过预处理,会变成(3,256,256)的float32 [0,1]的numpy.

1、要注意维度顺序:PIL.Image希望其RGB图像的形状是hxwx3 -通道维度最后,而pytorch更喜欢将图像表示为3xhxw -通道维度。

所以需要进行:image = Image.fromarray(image.transpose(1, 2, 0))

2、image取值0-1,需要乘255变成彩色图

3、Image.fromarray() 不支持float32类型的数据,需要将类型转换为Image.fromarray() 支持的类型即可(转为uint8类型)

pytorch中图片相关注意的问题_第1张图片



图片相关问题

判断灰度还是彩色图: 右击图片属性,摘要,点击详细属性,里面有位深度一项。

  • RGB图:位深度是24;
  • 灰度图:位深度是8(灰度是白灰黑表示的图,索引图有可能是彩色的,但也是8位深);
     

灰度图像和彩色图像区别:

  • 灰度图像:在每个像素点上只有一个分量,白色为255,黑色为0。像素值所需的数据长度有8 bit或10 bit两种,即图像的位深为8 bit或10 bit。
  • 彩色图像:以RGB格式的彩色图像为例,一幅完整的图像可以被分割为蓝(B分量)、绿(G分量)、红(R分量)三基色的单色图。例如图像深度为24,用R:G:B=8:8:8来表示色彩,则R、G、B各占用8位来表示各自基色分量的强度,每个基色分量的强度等级为2^8=256种。图像可容纳2^24=16M种色彩(24位色)。

PIL包中图像的mode参数:

pytorch中图片相关注意的问题_第2张图片

 

 

你可能感兴趣的:(日常学习内容,python,numpy,深度学习)