массив дополняющих изображений с серым фоном - PullRequest
1 голос
/ 02 октября 2019

Я сравниваю уменьшенные изображения, показывая их рядом, используя Image.fromarray(np.haystack(<list of image array>).show(). Проблема в том, что массивы изображений имеют разные размеры. Мое решение состоит в том, чтобы заполнить массив серым фоном (200, 200, 200) и сделать все массивы равными по размеру 200x200.

Мой вопрос: есть ли у numpy более прямой способ сделать это?

Мое решение:

def pad_with_gray_backgound(_array, size):
    array_padded = np.ones((size, size, 3), dtype=np.uint8)*200

    for i in range(array_padded.shape[0]):
        for j in range(array_padded.shape[1]):
            try:
                array_padded[i, j] = _array[i, j]
            except IndexError:
                pass

    return array_padded

и для вызова этой функции

import numpy as np
from PIL import Image

image_arrays = []
for pic in pic_selection:
    pic_thumbnail = io.BytesIO(pic.thumbnail.encode('ISO-8859-1'))
    padded_image_array = pad_with_gray_background(
        np.array(Image.open(pic_thumbnail)), 200)

    image_arrays.append(padded_image_array)

Image.fromarray(np.hstack(image_arrays)).show()

note pic.thumbnail - это байтовый объект, взятый из exif

1 Ответ

1 голос
/ 02 октября 2019

Ответ Марка Сетчелла заключается в использовании нарезки:

array_padded[0:height, 0:width, :] = image_array[:]

Просто убедитесь, что форма image_array не больше, чем array_padded.

import numpy as np
from PIL import Image

image_arrays = []
for pic in pic_selection:
    pic_thumbnail = io.BytesIO(pic.thumbnail.encode('ISO-8859-1'))
    image_array = np.array(Image.open(pic_thumbnail))

    height, width = (200, 200)
    array_padded = np.ones((height, width, 3), dtype=np.uint8)*200
    height = min(image_array.shape[0], height)
    width = min(image_array.shape[1], width)
    array_padded[0:height, 0:width, :] = image_array[0:height, 0:width, :]
    image_arrays.append(array_padded)

Image.fromarray(np.hstack(image_arrays)).show()
...