2017-02-27 320 views
2

我有这样的灰度图像:如何检测opencv(C++)中的异常如果阈值不够好?

enter image description here 我想检测这种图像的异常。在第一幅图像(左上角)上,我想检测三个点,在第二个(右上角)上有一个小圆点和一个“雾区”(右下角),最后一个在图像中间的某处也是一个小点。

正常的静态tresholding对我来说没有问题,大津的方法总是最好的选择。有没有更好,更强大或更智能的方法来检测这种异常?在Matlab中,我使用了类似Frangi Filtering(特征值过滤)的东西。任何人都可以建议好的处理算法来解决像这样的表面上的异常检测问题吗?

编辑:添加另一个图像具有显着的异常:

enter image description here

使用@Tapio的顶帽过滤和对比度adjustement。 由于@Tapio为我们提供了一个很好的主意,就像我在开始时问的那样,如何增加表面上的异常对比度,我向你们提供了一些结果。我曾经和这样的形象: enter image description here

这里是我的代码,我如何使用高顶礼帽过滤和对比adjustement:

kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3), Point(0, 0)); 
morphologyEx(inputImage, imgFiltered, MORPH_TOPHAT, kernel, Point(0, 0), 3); 
imgAdjusted = imgFiltered * 7.2; 

其结果是在这里:

enter image description here

有仍然质疑如何从最后的图像中分割出异常?所以如果有人有想法如何解决它,只要把它! :) ??

+1

计算灰度图像的平均值。高于平均值某个百分比的像素可以被声明为异常值 –

+2

@JeruLuke:这是一个“模式识别介绍”级别的答案,但对大津方法和特征值过滤的参考告诉我,我们并没有在看那个。 – MSalters

+0

您能否提供更多关于我应该关注的技巧以及如何进行模式识别?我是否也应该考虑一些“机器学习”的东西? – jok23

回答

3

你应该看看底帽过滤。它被定义为原始图像和图像形态闭合的差异,并且它使得您正在寻找的小细节更加明显。

first image pair

second image pair

third image pair

我调整对比度,使两个图像可见。查看强度时,异常情况更加明显,并且更容易分解。

让我们来看看第一个图像:

segmentation accuracy needed

直方图值并不代表现实由于我使用的可视化工具结垢造成的。但是相对距离呢。所以现在的阈值范围要大得多,目标从一个窗口变成了一个谷仓门。

全球阈值(强度> 15):

After global thresholding

大津的方法处理不好在这里。它将所有小细节分割到前景。

由形态开去除噪声后:

After morphological opening

我还假设黑点是你感兴趣的异常通过设置阈值您加入更多的表面细节。例如,第三张图片对我来说没有任何特别有趣的特征,但这是您要判断的。就像m3h0w说的那样,知道如果你的眼睛很难判断它对电脑来说可能是不可能的,这是一个很好的启发。

+0

这就是你@Tapio的一些特殊工作。你能给我提供一些C++代码吗?你是如何解决tophat过滤和第一幅图像的对比度调整的?我试过高帽过滤,它工作正常,但我看不到结果和你一样好。 – jok23

+1

@Tapio,这是伟大的工作。带有阈值的直方图可视化是否覆盖了您创建的某个东西,或者是某种原型工具? – m3h0w

+0

@Tapio我加了一个我的结果,因为你建议使用高帽和调整。您能否向我们提供您对该结果的评论,并向我们提供一些额外的建议以改进它们? – jok23

2

@ skoda23,我会尝试用模糊部分的微调参数进行反锐化遮罩,以便高频得到强调和彻底测试,以便在此过程中不会丢失重要信息。请记住,期望电脑做超人类工作通常不是个好主意。如果一个人怀疑异常在哪里,电脑将不得不这样做。因此,首先对图像进行预处理非常重要,这样异常对于人眼而言是显而易见的。模糊掩蔽(或加法)的替代方法可能是CLAHE。但是,请记住仔细调整它 - 它可能会过多地影响电路板的质感,并干扰您的工作。

基本阈值或Otsu的替代方法将是AdaptiveThreshold()这可能是一个好主意,因为您想要查找的不同区域之间的亮度值存在差异。

我的第二个猜测将首先使用固定值thresholding为最黑暗的点,然后尝试索贝尔,或坎尼。应该存在一个最佳的邻居,其中董事会的质地不会发光和异常会发光。您也可以在边缘检测之前尝试模糊(如果您使用阈值检测到小缺陷)。

再次说明:对于此任务的每一步都要进行大量实验,因为对参数进行微调对于最终成功至关重要。我建议与the trackbar交朋友,以加快这个过程。祝你好运!

+0

我同意所有的说法。但我仍然无法通过轨道条找到正确的参数。我试图解决像@MSalters所说的真实世界是“模拟”的问题。我在帖子中添加了一个额外的图像。请快速查看。你能推荐我吗?这里最好的过滤应该是什么。我目前正在尝试使用自适应阈值,但无法很好地调整它:/ – jok23

+1

@ skoda23如果您向我们提供显示哪些异常要检测哪些异常以及哪些异常正常并且应该是省略 – m3h0w

+0

我同意并添加了带有明显异常的图像。 – jok23

2

你基本上是在处理现实是模拟的不幸事实。阈值是将模拟量程变为离散(二进制)量程的一种方法。 任何阈值将做到这一点。那么,对于一个“足够好”的门槛,你究竟意味着什么?

让我们停下来想一下。我看到很多异常情况 - 一种很薄的灰色蠕虫。显然,你忽略了它们。我正在应用不同的门槛,然后你是。这可能是合理的,但是您正在应用我没有的领域知识。

我怀疑这些灰虫会抛弃你的固定值阈值。这并不是说固定阈值的概念是不好的。您可以使用它找到一些工件并排除这些工件。有些黑暗的斑块会被遗漏,但可以通过用邻域的中值替换每个像素,使用比这些蠕虫的宽度更大的邻域大小来展现。在黑暗的地方,这种做法很少,但是它抹去了小小的局部变化。

我不假装这两种类型的异常是唯一的两种,但这实际上是一个应用领域的问题,而不是技术。例如。你看起来没有任何制品(反射),至少在这3个样品中没有。