带有灰色背景的填充图像数组

时间:2019-10-02 05:18:53

标签: python numpy python-imaging-library

我正在通过使用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 个答案:

答案 0 :(得分:1)

Mark Setchell的答案是使用切片:

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()