Pytorch在保持纵横比的同时调整特定尺寸

gwo2fgha  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(184)

我有一些图像,其中一些高度〉=宽度,而另一些高度〈宽度。我想将图像调整为固定的高度,同时保持宽高比。我已经尝试使用torchvision.transforms.Resize(Documentation),然而,我遇到了一个问题,我不知道如何使用库函数解决。
我有两种可能性,我可以提供两个int,表示输出的大小,或者一个int,表示调整大小后输出图像的SMALLEST边的大小。
例如:image1是64x200(HxW),而image2是200x64。使用resize(32,..)(image)调整大小将产生大小为32x100的out_image1和大小为100x32的out_image2。然而,我希望第二个图像是32x10。
那么,我如何指定一个特定的尺寸,这是要缩放到我指定的大小,而另一个总是隐式地重新缩放,同时保持纵横比?
编辑:所以我基本上解决了它,它需要我做一个Resize的新示例,给它两个int并需要我手动计算新的宽度,如果有更优雅的解决方案已经实现我仍然想知道。必须反复示例化Resize,这使我无法将转换作为组合传递给Dataset类。相反,我必须在Dataset * 中实现resize转换getitem* 函数,这使得它不太灵活,直接将我的数据集交给组合转换。

gab6jxml

gab6jxml1#

你可以使用一个自定义的转换,它根据图像的长宽比来调整图像的大小。2这个转换采用一个固定的高度值,并调整输入图像的大小。3这是一个你应该如何进行的大致模式。

import math
from torchvision.transforms import functional as F

class FixedHeightResize:
    def __init__(self, size):
        self.size = size
        
    def __call__(self, img):
        w, h = img.size
        aspect_ratio = float(h) / float(w)
        new_w = math.ceil(self.size / aspect_ratio)
        return F.resize(img, (self.size, new_w))

接下来,您可以使用它来调整输入图像的大小,使其具有32的固定高度,同时保持纵横比。

img = Image.open("image.jpg")

transform = transforms.Compose([
    FixedHeightResize(32)
])

out_img = transform(img)

相关问题