在Python

时间:2017-02-24 15:23:58

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

如何使用Python(以及某些工具,如OpenCV)以编程方式从左侧的图像转到右侧的图像?

original processed

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

enter image description here

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

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

enter image description here

我将没有255值的所有像素设置为零。我用3x3内核将获得的图像扩张三次。然后我使用扩张图像作为原始图像的掩模(我将掩模外的所有像素设置为零),这是我得到的结果:

enter image description here

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