Transform和处理图像

        使用PyTorch、PIL、OpenCV和TensorBoard进行图像处理和记录,首先导入适当的库:

import torch
from torchvision import transforms
from PIL import Image
import cv2
from torch.utils.tensorboard import SummaryWriter

1.PIL和Tensor 转换

img_path = 'E:\\PyCharm_Project\\Pytorch_2.3.1\\pytorch_2024_06_06_01\\Dataset_a_b\\train\\ants\\0013035.jpg'
# PIL格式的img
img = Image.open(img_path)

# 将一个 PIL 图像转换为一个 PyTorch 张量。
# 主要是tensor包含了很多神经网络需要的东西,PIL 图像和 numpy 数组的通道顺序是 (高度,高 H,宽 W,信道数 C),而 PyTorch 张量的通道顺序是 (信道数 C,高度,高 H,宽 W)。transforms.ToTensor() 会自动完成这个转换。
# 需要先设计一个转换器tensor_trans
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
print(img_tensor)

         将一个 PIL 图像转换为一个 PyTorch 张量。并且转换后的tensor将原本的像素值(应该在[0,255]),转换为[0.0 , 1.0]之间

 

# 使用OpenCV读取图像,OpenCV的imread函数读取指定路径的图像文件。
cv_img = cv2.imread(img_path)

 
#  打印读取图像的形状,这个形状会是一个包含三个值的元组,分别表示图像的高度、高 H,宽 W,通道数 C。
print(cv_img.shape)

        顺带一提,OpenCV 读取图像的默认格式是 BGR(蓝、绿、红)格式,而不是更常见的 RGB(红、绿、蓝)格式。读取的图像存储为一个 numpy 数组,其形状是 (height, width, channels),即 (高, 宽, 通道数)。

# tensor直接就是(C,H,W)标准格式
writer = SummaryWriter('logs')

# 将图像添加到日志文件中,以便在 TensorBoard 中查看。‘img’是tag,在tensorboard里
writer.add_image('img', img_tensor)

# tensor转PIL
PIL_trans = transforms.ToPILImage()
img_PIL = PIL_trans(img_tensor)
print(img_PIL)

        在后面write.close()之后就能在tensorboard里看到名为img的图案了。

2.Normalize

        标准化图像数据,使每个像素值的范围从 [0, 1] 转换为均值为 0、标准差为 1 的范围。这有助于加快神经网络的训练并提高模型性能。标准化通常用于预处理步骤,以确保所有输入图像具有相似的统计特性。这样可以使模型更快地收敛,且更稳定。

# Normalize,需要输入均值和标准差,因为图片是三个信道,所以需要提供三个来组成转换器
# 创建一个 Normalize 转换器,使用均值 [0.5, 0.5, 0.5] 和标准差 [0.5, 0.5, 0.5]。该转换器对每个通道的像素值进行标准化,即 (value - mean) / std。
trans_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])

# 输入tensor,打印图像张量的第一个通道的第一个像素值,显示标准化之前的值。用于对比
print(img_tensor[0][0][0])

# 对图像张量进行标准化处理。
img_norm = trans_norm(img_tensor)

# 打印标准化后的第一个通道的第一个像素值。
print(img_norm[0][0][0])

# 将标准化后的图像添加到 TensorBoard 中。
writer.add_image('img_norm', img_norm)

3.Resize 

        调整图像的大小,以便输入到神经网络中。大多数神经网络需要固定大小的输入图像,因此需要对图像进行调整。经典的 ResNet 模型需要 224x224 的输入图像。

# Resize
# 打印原始 PIL 图像的大小。
print(img.size)

# 创建一个 Resize 转换器,将图像调整为 512x512 像素。
trans_size = transforms.Resize((512, 512))

# 调整 PIL 图像的大小。
img_resize = trans_size(img)

# 调整 PyTorch 张量的大小。
img_tensor = trans_size(img_tensor)

# 打印调整大小后的 PIL 图像对象和张量形状
print(img_resize)
print(img_tensor.size)

# 加入tensorboard
writer.add_image('img_tensor', img_tensor, 1)

4.Compose + Resize 

        多个步骤组合在一起 ,对图像进行处理。

# Compose + Resize
# 创建一个 Resize 转换器,将图像调整为 1024x1024 像素。
trans_resize = transforms.Resize(1024)

# 创建一个组合变换器,先将图像转换为张量,然后调整大小。
trans_com = transforms.Compose([tensor_trans, trans_resize])

# 对 PIL 图像应用组合变换。
img_com = trans_com(img)

# 记录在tensorboard里,并记录为第一步
writer.add_image('img_com', img_com, 1)

5.Randomcrop 

        随机裁剪图片。

# randomcrop
# 创建一个 RandomCrop 转换器,将图像随机裁剪为 224x224 像素。
trans_rancp = transforms.RandomCrop((224, 224))

# 创建一个组合变换器,先将图像转换为张量,然后进行随机裁剪。
trans_com_rc = transforms.Compose([tensor_trans, trans_rancp])

# 进行一个循环,重复执行下面的操作 10 次。
for i in range(10):
    img_crop = trans_com_rc(img)    # 对 PIL 图像应用组合变换(转换为张量并随机裁剪)。
    writer.add_image('img_crop', img_crop, i)    # 将每次随机裁剪后的图像添加到 TensorBoard 中,索引 i 作为每次的记录编号。

writer.close()

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值