Pytorch 中的 张量tensor《----》 PIL 转换

需要导入的工具库:
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import transforms as T

# loader使用torchvision中自带的transforms函数
loader = transforms.Compose([ transforms.ToTensor() ])
#在.Compose()中可添加多个操作,对图片进行改变
unloader = transforms.ToPILImage()

1. PIL读取图片转化为Tensor
输入图片地址返回tensor变量:

def  image_loader(image_name):
		image = Image.open(image_name).convert(‘RGB’)
		image = loader(image).unsqueeze(0)
		return  image.to(device, torch.float) 

2. Tensor转化为PIL图片
输入tensor变量 输出 PIL格式图片:

def  tensor_to_PIL(tensor):
		image = tensor.cpu().clone()
		image = image.squeeze(0)
		image = unloader(image)
		return  image

3. 直接展示tensor格式图片

def  imshow(tensor, title=None):
	image = tensor.cpu().clone()
	image = image.squeeze(0) 
	image = unloader(image)
	#先转换成PIL格式的image,再展示
	plt.imshow(image)

** 4、直接保存tensor格式图片**

def  save_image(tensor, **para):
		dir = ‘./results’
		image = tensor.cpu().clone() 
		image = image.squeeze(0)
		 image = unloader(image)
		 #先转换成PIL格式的image,再保存
		if not os.path.exists(dir):
			os.makedirs(dir)
		image.save(‘results_{}/s{}-c{}-l{}-e{}-sl{:4f}-cl{:4f}.jpg’.format(num,‘style_weight’,‘content_weight’,‘lr’,‘epoch’,‘style_loss’,‘content_loss’)) 

5. 将 N * H * W * C 的numpy格式图片转化为相应的tensor格式:

def  toTensor(img):
		img = torch.from_numpy( img.transpose((0, 3, 1, 2)) )
		return  img.float().div(255).unsqueeze(0)

Numpy的ndarray 或者Tensor转化成PILImage类型【在数据类型上,两者都有明确的要求】

1. ndarray的数据类型要求:

dtype=uint8, range[0, 255] and shape H x W x C

2. Tensor 的shape为: C * H * W 要求:

FloadTensor的,不允许DoubleTensor或者其他类型.

可以直接使用 pip torchsnooper 来安装:
用 **

@torchsnooper.snoop()

** 装饰一下要调试的函数,这个函数在执行的时候,就会自动print 出来每一行的执行结果的 tensor 的形状、数据类型、设备、是否需要梯度的信息

在使用

matplotlib的过程中:

常常会需要画很多图,但是好像并不能同时**展示许多图。**这是因为python可视化库matplotlib的显示模式默认为阻塞(block)模式。
什么是阻塞模式那?我的理解就是在plt.show()之后,程序会暂停到那儿,并不会继续执行下去。如果需要继续执行程序,就要关闭图片。
那如何展示动态图或多个窗口呢?这就要使用

图前 plt.ion() — 图后 plt.ioff()

这2个函数,使matplotlib的显示模式转换为交互(interactive)模式。即使在脚本中遇到plt.show(),代码还是会继续执行。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下代码将 PyTorch Tensor 转换为 NumPy 数组: ``` import numpy as np import torch tensor = torch.randn((3, 4)) # 创建一个大小为 3x4 的张 numpy_array = tensor.numpy() # 将张转换为 NumPy 数组 ``` 要将 NumPy 数组转换PyTorch Tensor,可以使用以下代码: ``` import numpy as np import torch numpy_array = np.random.rand(3, 4) # 创建一个大小为 3x4 的 NumPy 数组 tensor = torch.from_numpy(numpy_array) # 将 NumPy 数组转换为张 ``` 要将 PyTorch Tensor 转换为 OpenCV 的图像,可以使用以下代码: ``` import cv2 import torch tensor = torch.randn((3, 256, 256)) # 创建一个大小为 3x256x256 的张 image = tensor.permute(1, 2, 0).numpy() # 将张转换为 NumPy 数组,并将通道顺序从 CxHxW 转换为 HxWxC cv2.imshow("Image", image) # 显示图像 cv2.waitKey() # 等待关闭窗口 ``` 要将 OpenCV 的图像转换PyTorch Tensor,可以使用以下代码: ``` import cv2 import torch image = cv2.imread("image.png") # 读取图像文件 tensor = torch.from_numpy(image.transpose((2, 0, 1))) # 将图像转换为张,并将通道顺序从 HxWxC 转换为 CxHxW ``` 要将 PyTorch Tensor 转换Pillow 的图像,可以使用以下代码: ``` from PIL import Image import torch tensor = torch.randn((3, 256, 256)) # 创建一个大小为 3x256x256 的张 image = tensor.permute(1, 2, 0).numpy() # 将张转换为 NumPy 数组,并将通道顺序从 CxHxW 转换为 HxWxC pil_image = Image.fromarray((image * 255).astype('uint8')) # 将 NumPy 数组转换PIL 图像 pil_image.show() # 显示图像 ``` 要将 Pillow 的图像转换PyTorch Tensor,可以使用以下代码: ``` from PIL import Image import numpy as np import torch pil_image = Image.open("image.png") # 打开图像文件 numpy_array = np.array(pil_image) / 255.0 # 将 PIL 图像转换为 NumPy 数组,并将像素值转换为 0 到 1 之间的浮点数 tensor = torch.from_numpy(numpy_array.transpose((2, 0, 1))) # 将 NumPy 数组转换为张,并将通道顺序从 HxWxC 转换为 CxHxW ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值