在 Python 中以编程方式剪裁 image/remove 背景

Clipping image/remove background programmatically in Python

如何使用 Python(可能还有一些工具,如 OpenCV)以编程方式从左侧图像转到右侧图像?

我使用在线剪裁工具手工制作了这个。我在图像处理方面完全是菜鸟(尤其是在实践中)。我正在考虑应用一些边缘或轮廓检测来创建一个蒙版,稍后我将在原始图像上应用它以将其他所有内容(感兴趣区域除外)涂成黑色。但是我很惨。

目标是预处理非常相似图像的数据集,以训练 CNN 二元分类器。我试图通过只裁剪靠近感兴趣区域的图像来训练它,但是噪声太高以至于 CNN 完全没有学到任何东西。

有人可以帮我做这个预处理吗?

我用的是OpenCV的实现watershed algorithm to solve your problem. You can find out how to use it if you read this great tutorial,所以就不详细解释了。

我select编辑了四个点(标记)。一个位于您要提取的区域,一个在外部,另外两个在您不感兴趣的内部 lower/upper 部分内。然后我创建了一个空整数数组(so-called 标记图像)并用零填充它。然后我为标记位置的像素分配了唯一值。

下图显示了在原始图像上绘制的标记位置和标记值:

我也可以在同一区域内 select 更多标记(例如,属于您要提取的区域的多个标记),但在这种情况下,它们都应该具有相同的值(在本例中为 255 ).

然后我用了分水岭。第一个输入是您提供的图像,第二个输入是标记图像(除了标记位置以外的所有地方都为零)。该算法将结果存储在标记图像中;您感兴趣的区域标有区域标记的值(在本例中为 255):

我将所有不具有 255 值的像素设置为零。我用 3x3 内核将获得的图像放大了三倍。然后我使用膨胀后的图像作为原始图像的蒙版(我将蒙版外的所有像素设置为零),这是我得到的结果:

您可能需要某种可以自动找到标记的方法。该任务的难度在很大程度上取决于输入图像集。在某些情况下,该方法可能非常直接和简单(如上面链接的教程中所示),但有时这可能是一个棘手的问题。但我不能推荐任何东西,因为我不知道你的图片一般是什么样子的(你只提供了一张)。 :)