【Pytorch】图像处理 transforms

图像处理、转不同格式显示

import torch
import torchvision
import torchvision.transforms as transforms
import cv2
import numpy as np
from PIL import Image

img_path = "./data/timg.jpg"  

# transforms.ToTensor()
transform1 = transforms.Compose([
    transforms.ToTensor(),  # range [0, 255] -> [0.0,1.0]
]
)

##numpy.ndarray
img = cv2.imread(img_path)  # 读取图像 1080x1920x3(高*宽*通道),数值[0, 255]
print("img = ", img)
img1 = transform1(img)  # 归一化到 3x1080x1920(通道*高*宽),数值[0.0,1.0]
print("img1 = ", img1)

# 转化为numpy.ndarray并显示
img_1 = img1.numpy()*255
img_1 = img_1.astype('uint8')
img_1 = np.transpose(img_1, (1,2,0))
cv2.imshow('img_1', img_1)
cv2.waitKey()

##PIL
img = Image.open(img_path).convert('RGB') # 读取图像
img2 = transform1(img) # 归一化到 [0.0,1.0]
print("img2 = ",img2)

#转化为PILImage并显示
img_2 = transforms.ToPILImage()(img2).convert('RGB')
print("img_2 = ",img_2)
img_2.show()

transforms.Compose归一化到[-1.0, 1.0]

将上面的transform1改为如下所示:

transform2 = transforms.Compose([  
    transforms.ToTensor(),  
    transforms.Normalize(mean = (0.5, 0.5, 0.5), std = (0.5, 0.5, 0.5))  
    ]  
)  

解释
(1)transforms.Compose就是将transforms组合在一起;

(2)transforms.Normalize使用如下公式进行归一化:

channel=(channel-mean)/ std(因为transforms.ToTensor()已经把数据处理成[0,1],那么(x-0.5)/0.5就是[-1.0, 1.0])

这样一来,我们的数据中的每个值就变成了[-1,1]的数了。

torchvision.transforms.ToTensor()

将PILImage或者numpy的ndarray转化成Tensor:

  1. 对于PILImage转化的Tensor,其数据类型是torch.FloatTensor;
  2. 对于ndarray的数据类型没有限制,但转化成的Tensor的数据类型是由ndarray的数据类型决定的。

把一个取值范围是[0,255]的PIL.Image转换成Tensor,这个Tensor的取值范围是[0,1]。

img1 = Image.open('./Image/use_Crop.jpg')
 
t_out = transforms.ToTensor()(img1)

# 输出
# float64
# torch.DoubleTensor

torchvision.transforms.ToPILImage()

将Numpy的ndarray或者Tensor转化成PILImage类型 (to a PIL.Image of range [0, 255])【在数据类型上,两者都有明确的要求】:

  1. ndarray的数据类型要求dtype=uint8, range[0, 255] and shape H x W x C;
  2. Tensor 的shape为 C x H x W 要求是FloadTensor的,不允许DoubleTensor或者其他类型。

将ndarray转化成PILImage

#初始化随机数种子
np.random.seed(0)
 
data = np.random.randint(0, 255, 300)
print(data.dtype)
n_out = data.reshape(10,10,3)
 
#强制类型转换
n_out = n_out.astype(np.uint8)
print(n_out.dtype)
 
img2 = transforms.ToPILImage()(n_out)
img2.show()

将Tensor转化成PILImage

t_out = torch.randn(3,10,10)
img1 = transforms.ToPILImage()(t_out)
img1.show()

因为要求是FloatTensor类型,所以最好是不管此时的tensor是不是FloatTensor类型,都加一个强制转换再传进去。

t_out = torch.randn(3,10,10)
img1 = transforms.ToPILImage()(t_out.float())
img1.show()

综合处理,ndarray->Tensor->PILImage

n_out = np.random.rand(100,100,3)
t_out = transforms.ToTensor()(n_out)
img2 = transforms.ToPILImage()(t_out.float())  #强制类型转换
img2.show()

参考博客

(一)PyTorch学习笔记——pytorch图像处理(transforms)
Pytorch之浅入torchvision.transforms.ToTensor与ToPILImage
Pytorch之深入torchvision.transforms.ToTensor与ToPILImage

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值