在深度学习图像分类、物体检测等过程中,首先要对图像进行归一化和标准化。
原理:
归一化:
式中,input表示输入的图像像素值;max()、min()分别表示输入像素的最大值和最小值。output为输出图像像素值。经过归一化,图像像素被调整到[0,1]区间内。
标准化:
式中,input表示输入的图像像素值;mean(input)表示输入图像的像素均值。std表示输入图像像素的标准差。经过标准化,图像像素被调整到[-1,1]区间内。
代码实现:
import torchvision.transforms as transforms
from PIL import Image
import numpy as np
img_path = "/dog.jpg"
# 图像归一化
transform_GY = transforms.ToTensor()#将PIL.Image转化为tensor,即归一化。
# 注:shape 会从(H,W,C)变成(C,H,W)
# 图像标准化
transform_BZ= transforms.Normalize(
mean=[0.5, 0.5, 0.5],# 取决于数据集
std=[0.5, 0.5, 0.5]
)
# transform_compose
transform_compose= transforms.Compose([
# 先归一化再标准化
transform_GY ,
transform_BZ
])
img = Image.open(img_path)
# (H, W, C)变为(C, H, W)
img_transform = transform_compose(img)
# 输出变换后图像,需要将图像格式调整为PIL.Image形式
img_after = img_transform .numpy()
# 通道变换,(1,2,0)表示将(C,H,W)按此顺序变换为(H,W,C)
img_after = np.transpose(img_after, (1, 2, 0))
print("img_after = ", img_after)
# 输出
img_after = [[[-0.23921567 0.3803922 -0.34117645]
[-0.09019607 0.5372549 -0.2235294 ]
[-0.35686272 0.254902 -0.54509807]
...
...
...
[-0.3960784 0.05882359 -0.54509807]
[-0.10588235 0.28627455 -0.2862745 ]
[-0.49019605 -0.12156862 -0.67058825]]]