Предполагая, что img1
- это ваш первый массив (крупный сплошной шарик), а img2
- второй (меньший шарик с дырками), вам нужен метод для определения и удаления внешней области второго изображения.Алгоритм заливки является хорошим кандидатом.Он реализован в opencv как cv2.floodFill
.
Самое простое, что можно сделать, это заполнить внешний край, а затем просто сложить результаты вместе:
mask = np.zeros((img2.shape[0] + 2, img2.shape[1] + 2), dtype=np.uint8)
cv2.floodFill(img2, mask, (0, 0), 0, 0)
result = img1 + img2
Вот игрушечный пример, который показывает мини-изображения, топологически эквивалентные вашим оригиналам:
img1 = np.full((9, 9), 255, dtype=np.uint8)
img1[1:-1, 1:-1] = 0
img2 = np.full((9, 9), 255, dtype=np.uint8)
img2[2:-2, 2:-2] = 0
img2[3, 3] = img2[5, 5] = 255
Изображения выглядят так:
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.imshow(img1)
ax2.imshow(img2)
![start](https://i.stack.imgur.com/a6DL8.png)
После заливки изображения выглядят следующим образом:
![enter image description here](https://i.stack.imgur.com/Q3A72.png)
Добавление полученных изображений вместе выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/1KgsH.png)
Имейте в виду, что floodFill
работает на месте, поэтому вы можете сделать копию img2
, прежде чем идти по этому пути.