Pytorch之ToPILImage()不输出图片问题及解决

 更新时间:2024年02月27日 10:30:37   作者:Adversity-sl  
这篇文章主要介绍了Pytorch之ToPILImage()不输出图片问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Pytorch ToPILImage()不输出图片

先导torchvision包

from PIL import Image
from torchvision.transforms import ToTensor,ToPILImage

定义转换操作

img_to_tensor = ToTensor() # img -> tensor
tensor_to_pil = ToPILImage() # tensor -> img

读取图片

img = Image.open('../test.jpg') # ‘' 引号内为要读取图片的相对路径

把读取的图片转换成tensor进而对其操作,

unsqueeze(0)是在给转换后的tensor加一个维度

input = img_to_tensor(img).unsqueeze(0) #torch.Size([1, 3, 960, 720])

对图像进行一个简单的操作,此处用的3*3的kernel进行锐化卷积

kernel = t.ones(3,3)/-9.
kernel[1][1] = 1
conv = nn.Conv2d(1,1,(3,3),1,bias=False) #卷积
conv.weight.data = kernel.view(1,1,3,3) #权重

将图片传入卷积层,并输出

out = conv(V(input)) 
tensor_to_pil(out.data.squeeze(0)).show()

注意,此处若不用.show()则输出台无显示。

另附torchvision.transforms.ToTensor及torchvision.transforms.ToPILImage的转换过程

torchvision.transforms.ToTensor

对于一个图片img,调用ToTensor转化成张量的形式,发生的不是将图片的RGB三维信道矩阵变成tensor

图片在内存中以bytes的形式存储,转化过程的步骤是:

  • img.tobytes() 将图片转化成内存中的存储格式
  • torch.BytesStorage.frombuffer(img.tobytes() ) 将字节以流的形式输入,转化成一维的张量
  • 对张量进行reshape
  • 对张量进行permute(2,0,1)
  • 将当前张量的每个元素除以255
  • 输出张量

torchvision.transforms.ToPILImage

对于一个Tensor的转化过程是:

  • 将张量的每个元素乘上255
  • 将张量的数据类型有FloatTensor转化成Uint8
  • 将张量转化成numpy的ndarray类型
  • 对ndarray对象做permute (1, 2, 0)的操作
  • 利用Image下的fromarray函数,将ndarray对象转化成PILImage形式
  • 输出PILImage

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论