Объединить много маленьких изображений в одно большое изображение - PullRequest
1 голос
/ 09 марта 2020

У меня есть вопрос. Например, у меня есть 3 изображения (50x50px), и мне нужно, чтобы изображения были объединены в одно изображение (например, вывод составляет 500x500px). Моя проблема в том, что я не знаю, как комбинировать изображения по вертикали каждый раз, когда 3 изображения заполнены по горизонтали. И так шаг за шагом. Прямо сейчас я знаю только, как заполнить две строки (по горизонтали и по вертикали). Буду рад любой вашей помощи. Спасибо! Ниже приведен код, который делает то, что мне нужно, но я также хочу иметь возможность изменить размер изображения для новой строки или столбца:

img = 'path_to_image'
new_im = Image.new('RGB', (400, 400))
for x in range(0, 400, img.width):
    for y in range(0, 400, img.height):
        new_im.paste(img, (x, y))

1 Ответ

0 голосов
/ 09 марта 2020

Вы имеете в виду, как это?

import numpy as np
img_1 = np.ones((2, 2))
img_2 = np.ones((2, 2)) * 2
img_3 = np.ones((2, 2)) * 3

img = np.hstack([img_1, img_2, img_3])
# array([[1., 1., 2., 2., 3., 3.],
#        [1., 1., 2., 2., 3., 3.]])

new_shape = np.array([6, 12])
new_img = np.tile(img, reps=new_shape // np.array(img.shape))
# array([[1., 1., 2., 2., 3., 3., 1., 1., 2., 2., 3., 3.],
#        [1., 1., 2., 2., 3., 3., 1., 1., 2., 2., 3., 3.], 
#        [1., 1., 2., 2., 3., 3., 1., 1., 2., 2., 3., 3.],
#        [1., 1., 2., 2., 3., 3., 1., 1., 2., 2., 3., 3.],
#        [1., 1., 2., 2., 3., 3., 1., 1., 2., 2., 3., 3.],
#        [1., 1., 2., 2., 3., 3., 1., 1., 2., 2., 3., 3.]])

Если вы хотите дополнительно изменить размер изображения, возможно, этот ответ может помочь вам.

Этот подход агности c о том, как вы получите img. Важно то, что вы должны убедиться, что все комбинации начальных изображений в сумме дадут окончательную форму.

Если у вас есть изображения формы 50x50 и конечной формы 500x500, и вы комбинируете всегда 2, 3 или 4 из них вместе у вас есть:

  • 500 / (2 * 50) = 5
  • 500 / (3 * 50) = 3,33
  • 500 / (4 * 50) = 2,5

Так что это не сработает для вас. У вас есть два варианта: либо обрезать пиксели, которые не помещаются, либо изменить размер полученного изображения.

  • 500 / (2 * 50) = 5
  • 500 / (3 * 50) = 3,33 -> 4, изменить размер / обрезать от 500x600 до 500x500
  • 500 / (4 * 50) = 2,5 -> 3, изменить размер / обрезать от 500x600 до 500x500
import numpy as np
img_1 = np.ones((2, 2))
img_2 = np.ones((2, 2)) * 2
img_3 = np.ones((2, 2)) * 3
img_4 = np.ones((2, 2)) * 4
img_list = np.array([img_1, img_2, img_3, img_4])

# Get random combination of 2-4 images
img_dx_rnd = np.random.choice(np.arange(4), np.random.randint(2, 5), replace=False)
img = np.hstack([*img_list[img_dx_rnd]])

new_shape = np.array([6, 12])
reps = np.ceil(new_shape / np.array(img.shape)).astype(int)
new_img = np.tile(img, reps=reps)

# Cropping
new_img = new_img[:new_shape[0], :new_shape[1]]

# Resizing
from skimage.transform import resize
new_img = resize(new_img, new_shape)
...