Скопируйте пустой массив в часть другого массива, если границы превышают - PullRequest
0 голосов
/ 13 июня 2019

У меня есть увеличенное изображение и меньшее. Я хочу вставить меньший в определенную позицию большего. Проблема возникает, если координаты, в которые я хочу вставить изображение, таковы, что меньшее изображение выходит за границы большего. Я знаю, что могу сделать:

    larger_image[center_x - smaller_image.shape[0]/2 : center_x + smaller_image.shape[0]/2, center_y - smaller_image.shape[1]/2 : center_y + smaller_image.shape[1]/2] = smaller_image

Предположим, что center_x = center_y = 2, например, smaller_image.shape = (10, 10) и larger_image.shape = (20, 20), проблема возникает из-за того, что меньший_изображение не может быть полностью вставлено в больший. Есть ли способ избежать ошибочных ошибок и просто вставить часть меньшего_изображения, которое находится внутри более крупного_онуса?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Я не думаю, что есть простая функция, чтобы справиться с этим. Но вы можете принудительно увеличить индекс ваших больших значений до минимума и максимума, равного 0, и соответственно размеры вашего изображения и настроить индекс меньшего изображения аналогично:

dy_l, dx_l = larger_image.shape
dy_s, dx_s = smaller_image.shape

# Coordinates within larger image
ymin = int(max(0, center_y - dy_s/2))
ymax = int(min(dy_l, center_y + dy_s/2))
xmin = int(max(0, center_x - dx_s/2))
xmax = int(min(dx_l, center_x + dx_s/2))

# Coordinates within smaller image    
yoff0 = int(max(0, dy_s/2 - center_y))
yoff1 = int(dy_s + min(0, dy_l - (center_y + dy_s/2)))
xoff0 = int(max(0, dx_s/2 - center_x))
xoff1 = int(dx_s + min(0, dx_l - (center_x + dx_s/2)))

# Paste image
larger_image[ymin:ymax, xmin:xmax] = smaller_image[yoff0:yoff1, xoff0:xoff1]
0 голосов
/ 13 июня 2019

Сначала вы можете дополнить увеличенное изображение, а затем удалить заполнение:

x, y = smaller_image.shape

larger_image_pad = np.pad(larger_image, (x, y), mode='constant')
center_x += x
center_y += y
larger_image_pad[center_x - x//2 : center_x + x//2, center_y - y//2 : center_y + y//2] = smaller_image
larger_image = larger_image_pad[x:-x,y:-y]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...