代码之家  ›  专栏  ›  技术社区  ›  softbear

我该怎么做ImageOps.fit公司不是庄稼?

  •  2
  • softbear  · 技术社区  · 7 年前

    ImageOps.fit(source28x32, (128, 128)) 不裁剪上/下/侧边就能合身?我真的要找到的方面,相应地调整大小,使放大的版本不超过128x128,然后添加边界像素(或中心的图像在128x128画布)?请注意,源可以是任何比例,28x32只是一个例子。

    源图像(28x32)

    source image

    安装图像(128x128)

    fitted image

    这是我迄今为止的尝试,不是特别优雅

    def fit(im):
        size = 128
    
        x, y = im.size
        ratio = float(x) / float(y)
        if x > y:
            x = size
            y = size * 1 / ratio
        else:
            y = size
            x = size * ratio
        x, y = int(x), int(y)
        im = im.resize((x, y))
    
        new_im = Image.new('L', (size, size), 0)
        new_im.paste(im, ((size - x) / 2, (size - y) / 2))
        return new_im
    

    新安装的图像

    new fitted

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alistair Carscadden    7 年前

    下面是在这两种语言中实现的函数 PIL cv2 . 输入可以是任何大小;该函数找到将最大边拟合到所需宽度所需的比例,然后将其放置到所需宽度的黑色方形图像上。

    def resize_PIL(im, output_edge):
        scale = output_edge / max(im.size)
        new = Image.new(im.mode, (output_edge, output_edge), (0, 0, 0))
        paste = im.resize((int(im.width * scale), int(im.height * scale)), resample=Image.NEAREST)
        new.paste(paste, (0, 0))
        return new
    

    在cv2中

    def resize_cv2(im, output_edge):
        scale = output_edge / max(im.shape[:2])
        new = np.zeros((output_edge, output_edge, 3), np.uint8)
        paste = cv2.resize(im, None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST)
        new[:paste.shape[0], :paste.shape[1], :] = paste
        return new
    

    enter image description here enter image description here

    enter image description here enter image description here

    未显示:这些函数用于大于所需大小的图像