首页 > 解决方案 > 如何将这两个图像与 python numpy 和 opencv 合并?

问题描述

我有两个二进制图像。第一个是这样的:

在此处输入图像描述

最后一个是这样的:

在此处输入图像描述

它们没有相同大小的曲线。我想将第二个包含在黑色区域中的两个白色区域添加到第一个的黑色区域中。

我的代码是这样运行的,但这是一个错误的答案:

在此处输入图像描述

问题是这样的,我想得到我用最终图像绘制 最终 图像

在此处输入图像描述

我怎样才能完成这项任务?

标签: pythonnumpyopencvmask

解决方案


假设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)

开始

洪水填充后,图像如下所示:

在此处输入图像描述

将生成的图像添加在一起看起来像这样:

在此处输入图像描述

请记住,它floodFill是就地操作的,因此您可能需要img2在走这条路之前制作一份副本。


推荐阅读