图像等比例缩放
目前比较常用的就是-底下的cv2.()
cv2.resize(src, size, fx, fy, interpolation)
其中src是输入原始图像,size为缩放的尺寸,fx为可选择的沿水平轴的比例因子,fy为可选择的沿垂直轴的比例因子,是可选择的插值方法,其中有:cv.最近邻插值;cv.双线性插值;cv.三次样条插值;cv.区域插值,默认是使用cv.。
一般使用样例:
import cv2
# 原始图像读取
image = cv2.imread("XX.jpg")
# 输入你想要resize的图像尺寸。
size = 640
image_resize = cv2.resize(image, size)
目录下图像的遍历并保存:
import os
import cv2
# 输入原始图像存在的文件夹
datadir = "XXX"
# 设置保存路径
save_path = 'XXX'
if not os.path.exists(save_path):#如果路径不存在
os.makedirs(save_path)
# 输入你想要resize的图像尺寸。
SIZE = 640
#使用os.path生成路径。
path = os.path.join(datadir)
#使用os.listdir返回path路径下所有图像文件。
img_list = os.listdir(path)
# 遍历图像文件
for i in img_list:
img_array = cv2.imread(os.path.join(path, i), cv2.IMREAD_COLOR)
# resize
new_image = cv2.resize(img_array, (SIZE, SIZE))
os.path.join(save_path, str(i)) # 保存的图片与原始图片同名
#保存图片
cv2.imwrite(save_path, new_image)
等比例缩放
在这里,我只总结一个我自己使用的cv2下的等比例。
同样,一般使用案例:
import cv2
# 原始图像读取
image = cv2.imread("XX.jpg")
# 输入你想要resize的图像高。
size = 640
# 获取原始图像宽高。
height, width = image.shape[0], image.shape[1]
# 等比例缩放尺度。
scale = height/size
# 获得相应等比例的图像宽度。
width_size = int(width/scale)
# resize
image_resize = cv2.resize(image, (width_size, size))
同样目录下使用:
import os
import cv2
# 输入原始图像存在的文件夹
datadir = "XXX"
# 设置保存路径
save_path = 'XXX'
if not os.path.exists(save_path):#如果路径不存在
os.makedirs(save_path)
# 输入你想要resize的图像尺寸。
size = 640
# 获取原始图像宽高。
height, width = image.shape[0], image.shape[1]
# 等比例缩放尺度。
scale = height/size # 1
# 获得相应等比例的图像宽度。
width_size = int(width/scale) # 2
#使用os.path生成路径。
path = os.path.join(datadir)
#使用os.listdir返回path路径下所有图像文件。
img_list = os.listdir(path)
# 遍历图像文件
for i in img_list:
img_array = cv2.imread(os.path.join(path, i), cv2.IMREAD_COLOR)
# resize
new_image = cv2.resize(img_array, (width_size, size))
os.path.join(save_path, str(i)) # 保存的图片与原始图片同名
#保存图片
cv2.imwrite(save_path, new_image)
我这里是按照修改高度,来等比例修改宽度的,如果你要先修改宽度,就调换一下1,2的位置就可以了。
下,对多维进行缩放
我想对特征图进行缩放,它是类型的。所以我们用不了cv2.,我看了网上有很多的方法,有说使用torch下的(),用.()。我还是选择使用torch.nn..
我亲测觉得对特征图缩放好用。
先来说一下这个函数。
torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)
其中,input是我们的输入张量();size是输出大小(int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int]); (float or Tuple[float]) 指定输出为输入的多少倍数。如果输入为tuple,其也要制定为tuple类型;mode就是上采样算法了,有’’, ‘’, ‘’, ‘’ , ‘’和’area’,其中默认是’’;最后一个,我们用官方的解释:
(bool, ) – 几何上,我们认为输入和输出的像素是正方形,而不是点。如果设置为True,则输入和输出张量由其角像素的中心点对齐,从而保留角像素处的值。如果设置为False,则输入和输出张量由它们的角像素的角点对齐,插值使用边界外值的边值填充;当保持不变时,使该操作独立于输入大小。仅当使用的算法为’’, ‘’, '’or '’时可以使用。默认设置为False。
我列出了我一般的缩放。
这里要注意一点,这个函数要求我要四维张量。也就是B,C,W,H
所以一般使用案例:
# 我这里的tran_mask是一个三维的张量,所以我进行了一个.unsqueeze()的操作。补齐了四维
train_mask = train_mask.unsqueeze(1).float()
# 然后我采用的是四分之一的下采样操作。
train_mask = torch.nn.functional.interpolate(train_mask, scale_factor=1 / 4, mode='bilinear',
align_corners=False)
# 如果你们还要返回你之前的三维张量,那么就进行如下操作。.squeeze()。
train_mask = train_mask.squeeze(1).float()
主要函数还是在于torch.nn..(),这也就不列出什么目录下的下采样了。我们主要还是对特征层进行处理。当然,它的是每个通道下的W,H哦。
我觉得挺好用,之前用的时候,根本不知道变成了啥,。。。。。。。。。。。