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,对应的归一化之后的部分图像数据:
在这里插入图片描述
在这里插入图片描述

有不足之处望指出!

### 如何在PyTorch中使用OpenCV进行图像处理 #### 使用OpenCV读取和预处理图像 为了使图像能够被PyTorch中的神经网络接受,通常需要先用OpenCV加载图片并调整其大小。下面展示了一个简单的例子,说明怎样从文件路径加载一张彩色照片,并将其转换成适合传递给PyTorch模型的形式。 ```python import cv2 import torch from torchvision import transforms def preprocess_image(image_path): # 加载原始BGR格式的图像数据 img_bgr = cv2.imread(image_path) # 将颜色空间从BGR转为RGB img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # 定义一系列变换操作用于标准化输入尺寸及数值范围 transform = transforms.Compose([ transforms.ToPILImage(), transforms.Resize((224, 224)), # 调整到指定分辨率 transforms.ToTensor(), # 转换成张量形式 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 归一化 ]) tensor_img = transform(img_rgb).unsqueeze(0) # 添加批次维度 return tensor_img ``` 这段代码展示了如何利用`cv2.imread()`函数读入一幅图像,并通过色彩模式转换(`cv2.cvtColor`)使其适应于后续处理步骤的要求[^1]。接着应用了一系列来自`torchvision.transforms`模块的操作来准备最终送入深度学习框架的数据结构——四维浮点数类型的张量对象[^3]。 #### 结合PyTorch模型进行推理 一旦完成了上述准备工作之后,就可以轻松地把经过预处理后的图像传送给任何已训练好的卷积神经网络来进行预测分析了: ```python model.eval() # 设置模型进入评估模式 with torch.no_grad(): # 关闭梯度跟踪以节省内存资源 output = model(tensor_img) probabilities = torch.nn.functional.softmax(output[0], dim=0) predicted_class_idx = probabilities.argmax().item() print(f'Predicted class index: {predicted_class_idx}') ``` 这里假设有一个名为`model`的对象代表之前已经完成训练过程的目标识别器实例;调用`.eval()`方法可以确保所有层处于正确的状态以便执行前向传播运算而不触发反向传播机制。最后一步则是采用softmax激活函数计算各类别的概率分布情况,并挑选出得分最高的那一类作为最终的结果输出[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值