Pytorch图像处理——读取、变换、归一化

图像的读取与大小变换

此部分需要导入的包:

import imageio  #imageio用来读取图像
from skimage.transform import resize  #resize更改图像尺寸大小
from matplotlib import pyplot as plt  #plt提供画图工具

首先,我们根据图片路径使用imageio包中的imread函数来读取图片:

image_path = './img/img3.jpeg'
img = imageio.imread(image_path)

此时,图像的输出为imgHeight × imgWidth × 3的数据,因为我们自己随意找的原生图像可能宽和高不同,所以这里以imgHeightimgWidth来代替。

接下来,为了更直观地查看图片我们要用matlibplot包中的pyplot(plt)来画图:

fig = plt.figure()	#建立画布
a = fig.add_subplot(1, 2, 1)
plt.imshow(img)  #此处的img为上面直接读取的img
a.set_title("Before")

img = resize(img, (256, 256))	#这里将原生图像进行resize,变为256*256*3的形式
a = fig.add_subplot(1, 2, 2)
a.set_title("After")
plt.imshow(img)

plt.show()	#show出两幅图,before为原生图像,after为resize后的图像

效果图:
在这里插入图片描述

图像的归一化

此部分需要导入的包:

import imageio  #imageio用来读取图像
import torch  #torch包,主要用来生成tensor
from skimage.transform import resize  #resize更改图像尺寸大小
from matplotlib import pyplot as plt  #plt提供画图工具

第一步,我们也需要先读入图像,并对其进行resize操作,并建立画布:

# 读取图像
img = imageio.imread(image_path)
img = resize(img, (256, 256))	#resize
print("Before normalize: \n",img)

# 建立画布
fig = plt.figure()
a = fig.add_subplot(1, 2, 1)
plt.imshow(img)
a.set_title("Before")

接下来,我们需要对大小为256 × 256 × 3的图像进行归一化处理,其中包含两步操作:

  1. 去均值
  2. 除方差

假设我们得到的大量图像数据集,如Flick30,很多实验人员已经测出对结果影响比较好的图像均值与方差,所以我们可以借鉴经验:
这里假设我们的均值为:
mean=[0.485, 0.456, 0.406] (RGB)
这里假设我们的方差为:
std=[0.229, 0.224, 0.225] (RGB)

mean=[0.485, 0.456, 0.406]
std=[0.229, 0.224, 0.225]

#下面将img、mean、std的维度保持一致,且将其类型均转换为 FloatTensor 方便运算
img = torch.FloatTensor(img)
mean = torch.FloatTensor(256*[256*[mean]])
std = torch.FloatTensor(256*[256*[std]])

# img-mean:去均值 , /std 除方差
img = (img - mean) / std

#下面是画图
print("After normalize: \n",img)
a = fig.add_subplot(1, 2, 2)
a.set_title("After")
plt.imshow(img)
plt.show()  #show出差异

效果图1:
在这里插入图片描述

  • 我们可以看到,对于这张图片,在归一化操作后,所有像素值都会落在[-1,1]之间,但又由于plt可以显示的像素值范围分别是[0,255](整数)、[0.,1](浮点数),所以我们在After图中看到的白色部分,其实是经过归一化后出现的负值或0。
  • 在深度学习训练的反向传播过程中,梯度下降法在反向传播的过程中,经实验证明,如果数据是经过归一化操作的,梯度收敛的速度会被加快~。

在这张图的对比中我们也可以看出,经过归一化的图,更突出了原图颜色突出的部分,而更忽略了色彩相对较淡的部分

效果图2:
在这里插入图片描述
效果图3,归一化之前的部分图像数据:
在这里插入图片描述
在这里插入图片描述
效果图4,对应的归一化之后的部分图像数据:
在这里插入图片描述
在这里插入图片描述

有不足之处望指出!

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,图像数据的归一化可以通过使用torchvision.transforms.Normalize()函数来实现。该函数需要传入三个参数,分别是均值(mean)、标准差(std)、以及一个布尔值,用来指示是否将图像像素值剪裁到0和1之间。 具体的步骤如下: 1. 首先,根据数据集计算图像的均值和标准差。可以使用torchvision.datasets.ImageFolder()函数加载数据集,并使用torch.utils.data.DataLoader()函数生成一个数据加载器。 2. 接下来,使用torchvision.transforms.Compose()函数将多个图像预处理操作组合起来。常见的预处理操作包括图像尺寸调整、裁剪、翻转、旋转等。 3. 在组合的图像预处理操作中,添加torchvision.transforms.ToTensor()函数,将图像转换为张量形式。 4. 最后,添加torchvision.transforms.Normalize()函数,传入计算得到的均值和标准差作为参数,并设置布尔值为True,以剪裁图像像素值到0和1之间。 参考代码如下所示: ``` import torchvision.transforms as transforms # 计算数据集的均值和标准差 dataset = torchvision.datasets.ImageFolder(root='dataset_path', transform=transforms.ToTensor()) data_loader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True) mean = 0.0 std = 0.0 for images, _ in data_loader: batch_mean = torch.mean(images, dim=(0, 2, 3)) batch_std = torch.std(images, dim=(0, 2, 3)) mean += batch_mean std += batch_std mean /= len(data_loader) std /= len(data_loader) # 图像预处理操作 preprocess = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean, std) ]) # 使用预处理操作对图像进行归一化处理 normalized_image = preprocess(image) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值