如果边界超过,将一个numpy数组复制到另一个数组的一部分中

时间:2019-06-13 14:01:12

标签: python numpy

我的图像较大而较小。我想将较小的粘贴到较大的特定位置。如果我要粘贴图像的坐标使得较小的图像超过较大的图像的边界,则会出现问题。 我知道我可以做到:

    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 = 2smaller_image.shape = (10, 10)这样的larger_image.shape = (20, 20)会出现问题,因为无法将small_image完全粘贴在较大的图像上。 有没有一种方法可以避免出现numpy错误,而只需粘贴Larger_one内部的small_image的一部分?

2 个答案:

答案 0 :(得分:2)

我认为没有简单的功能可以处理此问题。但是,您可以强制将较大值的索引分别设置为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]

答案 1 :(得分:0)

您可以先填充较大的图像,然后再移除填充物:

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]