Вы имеете в виду, как это?
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)