python - 在 Python 中以编程方式裁剪图像/删除背景

标签 python opencv image-processing conv-neural-network

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

original processed

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

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

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

最佳答案

我使用了 OpenCV 的 watershed 实现算法来解决你的问题。如果您阅读 this great tutorial,您可以了解如何使用它。 , 所以我不会详细解释这一点。

我选择了四个点(标记)。一个位于您要提取的区域,一个在外部,另外两个在您不感兴趣的内部的下部/上部。然后我创建了一个空整数数组(所谓的标记图像)并用零填充它。然后我为标记位置的像素分配了唯一值。

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

enter image description here

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

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

enter image description here

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

enter image description here

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

关于python - 在 Python 中以编程方式裁剪图像/删除背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442279/

相关文章:

python - 发送 subprocess.Popen stdout, stderr 到日志记录模块

python - 无法挤压 dim[1],期望维度为 1,得到 499

image-processing - 与 Opencv 的相位相关

c++ - OpenCV 编辑单个波段并重新合并

python - 我应该向我的 CNN 提供什么?大输入矩阵还是 10,000 个小输入矩阵?

image-processing - 如何对 Keras 生成器中的多个图像应用相同的转换?

javascript - 如何将详细图像加载为 HTML 背景?

python - 如何使用 PyQt 抓取桌面屏幕截图?

c++ - 解释 ARM Neon 图像采样

python - 将 sympy 与 esky 一起使用时生成错误