python 图像等比例缩放

目前比较常用的就是opencv-python底下的 cv2.resize()

cv2.resize(src, size, fx, fy, interpolation)

其中 src是输入原始图像, size为缩放的尺寸, fx为可选择的沿水平轴的比例因子, fy为可选择的沿垂直轴的比例因子, interpolation是可选择的插值方法,其中有:cv.INTER_NEAREST最近邻插值;cv.INTER_LINEAR双线性插值;cv.INTER_CUBIC三次样条插值;cv.INTER_AREA区域插值,默认是使用cv.INTER_LINEAR。

一般使用样例:

import cv2

image = cv2.imread("XX.jpg")

size = 640
image_resize = cv2.resize(image, size)

目录下图像的遍历resize并保存:

import os
import cv2

datadir = "XXX"

save_path = 'XXX'
if not os.path.exists(save_path):
    os.makedirs(save_path)

SIZE = 640

path = os.path.join(datadir)

img_list = os.listdir(path)

for i in img_list:
    img_array = cv2.imread(os.path.join(path, i), cv2.IMREAD_COLOR)

    new_image = cv2.resize(img_array, (SIZE, SIZE))
    os.path.join(save_path, str(i))

    cv2.imwrite(save_path, new_image)

等比例缩放

在这里,我只总结一个我自己使用的cv2下的等比例resize。

同样,一般使用案例:

import cv2

image = cv2.imread("XX.jpg")

size = 640

height, width = image.shape[0], image.shape[1]

scale = height/size

width_size = int(width/scale)

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)

size = 640

height, width = image.shape[0], image.shape[1]

scale = height/size

width_size = int(width/scale)

path = os.path.join(datadir)

img_list = os.listdir(path)

for i in img_list:
    img_array = cv2.imread(os.path.join(path, i), cv2.IMREAD_COLOR)

    new_image = cv2.resize(img_array, (width_size, size))
    os.path.join(save_path, str(i))

    cv2.imwrite(save_path, new_image)

我这里是按照修改高度,来等比例修改宽度的,如果你要先修改宽度,就调换一下1,2的位置就可以了。

我想对特征图进行缩放,它是tensor类型的。所以我们用不了 cv2.resize,我看了网上有很多resize的方法,有说使用torch下的 resize_(),用 transform.resize()。我还是选择使用 torch.nn.functional.interpolate
我亲测觉得对特征图缩放好用。

先来说一下这个函数。

torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)

其中,input是我们的输入张量(Tensor);size是输出大小(int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int]);scale_factor (float or Tuple[float]) 指定输出为输入的多少倍数。如果输入为tuple,其也要制定为tuple类型;mode就是上采样算法了,有’nearest’, ‘linear’, ‘bilinear’, ‘bicubic’ , ‘trilinear’和’area’,其中默认是’nearest’;最后一个,我们用官方的解释:
align_corners (bool, optional) – 几何上,我们认为输入和输出的像素是正方形,而不是点。如果设置为True,则输入和输出张量由其角像素的中心点对齐,从而保留角像素处的值。如果设置为False,则输入和输出张量由它们的角像素的角点对齐,插值使用边界外值的边值填充;当scale_factor保持不变时,使该操作独立于输入大小。仅当使用的算法为’linear’, ‘bilinear’, ‘bilinear’or ‘trilinear’时可以使用。默认设置为False。

我列出了我一般的Tensor缩放。
这里要注意一点,这个函数要求我要四维张量。也就是B,C,W,H
所以一般使用案例:


train_mask = train_mask.unsqueeze(1).float()

train_mask = torch.nn.functional.interpolate(train_mask, scale_factor=1 / 4, mode='bilinear',
                                                    align_corners=False)

train_mask = train_mask.squeeze(1).float()

主要函数还是在于 torch.nn.functional.interpolate(),这也就不列出什么目录下的下采样了。我们主要还是对特征层进行处理。当然,它resize的是每个通道下的W,H哦。

我觉得挺好用,之前用resize_的时候,根本不知道变成了啥,。。。。。。。。。。。

Original: https://blog.csdn.net/giganticpower/article/details/121309231
Author: giganticpower
Title: python 图像等比例缩放

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/636777/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球