一:在图像读取时,常用的读取方式包括PIL和CV2。
1:用PIL读取
首先载入PIL,接着用Image打开图片。
from PIL import Image
image = Image.open("D:/PycharmProjects/python function/0005.png")
print(type(image))
image = image.resize((512, 1024),Image.BICUBIC)
print(image.size)#(512, 1024)
PIL打开的图片是PIL.IMAGE格式,因此可以用**image.resize()**对图像进行缩放等,参数包括你需要的目标尺寸和采样方式。而查看图片格式可以直接调用image.size,但是只能查看长和宽无法查看通道,如果用shape是无法打开的,也可以直接使用type函数查看。
对于PIL图片还可以用torch的transforms 函数进行处理,值得注意的是,如果你的torch版本和torchvision版本不匹配会报错,没有InterpolationMode,这是你可以使用上一种方法。TR.functional.resize包括输入图片,目标尺寸,采样方式等三个参数,也可以用size函数查看大小。注意变换后的图片大小会经过调换,输入的是(15, 1024),输出的是(1024, 15)。且无法查看通道只能查看长和宽。
from torchvision import transforms as TR
from torchvision.transforms import InterpolationMode
new = TR.functional.resize(image, (15, 1024), InterpolationMode.NEAREST)
print(new.size)#(1024, 15)
2:opencv读取
使用cv2也可以读入图片,读取后的类型为numpy格式。但是读取后图片的大小为**(H,W,C),如果对图片进行操作,可以用cv2.resize**,参数包括输入图片,大小,采样方式。值得注意的是resize会将大小进行调换,例如输入的是(512,1024),输出的是(1024,512,3)。查看大小可以采用shape函数。
import cv2
i = cv2.imread("D:/PycharmProjects/python function/0005.png")
print(type(i))
l = cv2.resize(i,(512,1024),cv2.INTER_NEAREST)
print(i.shape)
print(l.shape)#(1024,512,3)
二:在图像处理时,常用的包括Upsample和F.interpolate
1:使用nn.Upsample
首先将numpy格式图片转换为tensor格式。numpy格式图片转换为tensor后变为**(C,H,W)。使用nn.Upsample可以对转换后的tensor直接进行上采样,通过参数scale_factor**调整倍数。
import torch.nn as nn
i = cv2.imread("D:/PycharmProjects/python function/0005.png")
q = TR.functional.to_tensor(i)
m = nn.Upsample(scale_factor=2)(q)#torch.Size([3, 1024, 1024])
2:使用F.interpolate
F.interpolate无法处理只有三个维度(C,H,W)的图片,在模型训练中不会出现三个维度的图片,因为在数据载入时候已经添加了batch维度。因为需要手动给图片添加一个batch维度变为(B,C,H,W),使用unsqueeze函数。F.interpolate包含输入图片,目标尺寸和采样方式三个参数。在实际中可以通过控制size参数对图片进行任意尺寸的变化。
import torch.nn.functional as F
q = q.unsqueeze(dim=0)
j = F.interpolate(q,size=[34,56],mode="bilinear")#torch.Size([1, 3, 34, 56])