我正在通过使用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提取的字节对象
答案 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()