Как мне сделать ImageOps.fit не обрезать? - PullRequest
0 голосов
/ 08 сентября 2018

Как мне установить 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 Ответ

0 голосов
/ 10 сентября 2018

Вот функция, реализованная в PIL и cv2.Ввод может быть любого размера;функция находит масштаб, необходимый для подгонки наибольшего края к желаемой ширине, а затем помещает его на изображение черного квадрата нужной ширины.

In PIL

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

При желаемой ширине 128:

enter image description hereenter image description here

enter image description hereenter image description here

Не показано: эти функции работают с изображениями, размер которых превышает требуемый размер

...