1.numpy.ndarray与tensor之间的转换
import cv2 as cv
from torchvision import transforms
image = cv.imread("test.jpg")
transform = transforms.Compose([
transforms.ToTensor()
])
image_tensor = transform(image)
转为tensor后通道数变成了第一维度,并且tensor中的元素全部在区间[0.0, 1.0]。
转为numpy.ndarray:
image_array = (image_tensor.numpy() * 255).astype('uint8')
image_array = np.transpose(image_array, (1, 2, 0))
transpose
之前的shape是(channels, y, x),其下标索引为(0, 1, 2),但是用cv显示图像必须得是channels放在最后一个维度,所以需要按照shape为(1, 2, 0)进行变换,即变换为(y, x, channels)。
2.tensor标准化处理
import cv2 as cv
from torchvision import transforms
image = cv.imread("test.jpg")
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
])
image_tensor = transform(image)
该过程为先将numpy形式转为tensor,再进行z标准化,其中mean和std分别为三个通道进行z标准化的均值和标准差。
3.以图象中心点为基准进行裁剪
from PIL import Image
from torchvision import transforms
image = Image.open("test.jpg")
width, height = image.size
width_red, height_red = int(width / 2), int(height / 2)
transform = transforms.Compose([
transforms.CenterCrop((width_red, height_red)),
transforms.ToTensor(),
])
image_tensor = transform(image)
image_pil = transforms.ToPILImage()(image_tensor)
image_pil.show()
中心裁剪仅支持PIL类型的图像,不支持通过opencv读取的像素数组。CenterCrop()
的参数可以是int,也可以是元组,是int类型的裁剪图像的大小即为(int, int)。