1. 读取原图像数据,和尺寸
import cv2
from matplotlib import pyplot as plt
from PIL import Image
import numpy as np
#原始图片大小为[H,W]-->[317,227]
image_path = "./images/smoke.jpg"
#opencv 读取图片,图片格式默认是BGR图片
img_cv = cv2.imread(image_path)
#读取的图片的尺寸信息
img_cv.shape
图片的尺寸大小为:
(317, 227, 3)
显示图像,cv默认按照BGR通道读取。 按照那种通道读取无所谓,重要的是要保证训练和推理的方式保持一致
#opencv imread读取的数据格式数array数组
plt.imshow(img_cv)
2. 定义resize函数,支持直接缩放和定比例缩放
#imag: 图像array数组,(H,W,C)格式
#resize_uniform:表示是否进行等比例缩放
#return:resize之后的图像array数组,和resize的scale值
def resize(img,size=448, resize_uniform = True, boder_color=[0,0,0]):
H,W,C = img.shape
if resize_uniform:
scale_h = size/max(H,W)
scale_w = scale_h
dst_h = int(H*scale_h)
dst_w = int(W*scale_h)
img_resize = cv2.resize(img, (dst_w, dst_h), interpolation=cv2.INTER_AREA)
#因为缩放的是图片的额最大的方向,所以填充颜色是在小的图片方向上
boder_size = max(abs(dst_h-H),abs(dst_w-W))
#copyMakeBorder(img, top,bootom,left,right)
img_resize = cv2.copyMakeBorder(img_resize,0, 0, int(boder_size/2), int(boder_size/2) ,cv2.BORDER_CONSTANT,value=boder_color)
else:
img_resize = cv2.resize(img, (size, size), interpolation=cv2.INTER_AREA)
scale_h = size/H
scale_w = size/W
return img_resize,scale_h,scale_w
2.1 直接缩放
img_resize,scale_h,scale_w = resize(img_cv)
scale_h,scale_w
缩放因子:
(1.413249211356467, 1.413249211356467)
显示效果:
plt.imshow(img_resize)
2.2 定比例缩放
img_resize,scale_h,scale_w = resize(img_cv, resize_uniform = False)
显示效果:
plt.imshow(img_resize)
等比例缩放,默认会在端的边界方向上填充黑色。
3 图像归一化
可以直接对像素进行归一化(plt可以显示归一化后的图像)
plt.imshow(img_cv/255)
更多是是计算整个训练接的mean和std,然后通过(x-mean)/std,计算[-1, 1]的归一化值,pytorch中的实现方式如下
import torchvision.transforms as transforms
transfrom = transforms.Compose([
transforms.ToTensor(), # height * width * channel -> channel * height * width
transforms.Normalize(mean=(0.5,0.5,0.5),std=(0.5,0.5,0.5))
])
原数据:
img_cv
array([[[ 14, 19, 22],
[ 5, 10, 13],
[ 7, 12, 13],
...,
[245, 248, 252],
[249, 252, 255],
[252, 253, 255]],
[[ 7, 12, 15],
[ 10, 15, 18],
[ 8, 13, 14],
...,
[166, 169, 173],
[223, 226, 230],
[243, 244, 248]],
[[ 12, 17, 20],
[ 16, 21, 24],
[ 10, 15, 18],
...,
[101, 106, 109],
[133, 138, 141],
[220, 223, 227]],
...,
[[ 7, 12, 13],
[ 9, 14, 13],
[ 14, 17, 15],
...,
[ 18, 19, 29],
[ 18, 19, 29],
[ 19, 16, 25]],
[[ 8, 13, 14],
[ 6, 11, 10],
[ 19, 21, 21],
...,
[ 18, 20, 30],
[ 19, 21, 29],
[ 9, 6, 15]],
[[ 15, 20, 21],
[ 5, 10, 9],
[ 18, 20, 20],
...,
[ 18, 20, 30],
[ 19, 21, 29],
[ 19, 16, 25]]], dtype=uint8)
归一化后的数据
train_data = transfrom(img_cv)
tensor([[[-0.8902, -0.9608, -0.9451, ..., 0.9216, 0.9529, 0.9765],
[-0.9451, -0.9216, -0.9373, ..., 0.3020, 0.7490, 0.9059],
[-0.9059, -0.8745, -0.9216, ..., -0.2078, 0.0431, 0.7255],
...,
[-0.9451, -0.9294, -0.8902, ..., -0.8588, -0.8588, -0.8510],
[-0.9373, -0.9529, -0.8510, ..., -0.8588, -0.8510, -0.9294],
[-0.8824, -0.9608, -0.8588, ..., -0.8588, -0.8510, -0.8510]],
[[-0.8510, -0.9216, -0.9059, ..., 0.9451, 0.9765, 0.9843],
[-0.9059, -0.8824, -0.8980, ..., 0.3255, 0.7725, 0.9137],
[-0.8667, -0.8353, -0.8824, ..., -0.1686, 0.0824, 0.7490],
...,
[-0.9059, -0.8902, -0.8667, ..., -0.8510, -0.8510, -0.8745],
[-0.8980, -0.9137, -0.8353, ..., -0.8431, -0.8353, -0.9529],
[-0.8431, -0.9216, -0.8431, ..., -0.8431, -0.8353, -0.8745]],
[[-0.8275, -0.8980, -0.8980, ..., 0.9765, 1.0000, 1.0000],
[-0.8824, -0.8588, -0.8902, ..., 0.3569, 0.8039, 0.9451],
[-0.8431, -0.8118, -0.8588, ..., -0.1451, 0.1059, 0.7804],
...,
[-0.8980, -0.8980, -0.8824, ..., -0.7725, -0.7725, -0.8039],
[-0.8902, -0.9216, -0.8353, ..., -0.7647, -0.7725, -0.8824],
[-0.8353, -0.9294, -0.8431, ..., -0.7647, -0.7725, -0.8039]]])
train_data.shape
torch.Size([3, 317, 227])