2

我有这样的灰度图像:

在此处输入图像描述 我想检测这种图像的异常情况。在第一张图像(左上)我想检测三个点,在第二张(右上)有一个小点和一个“雾区”(在右下),最后一个,有也是图像中间某处的一个小点。

正常的静态阈值对我来说不起作用,而且 Otsu 的方法始终是最佳选择。有没有更好、更强大或更智能的方法来检测这样的异常?在 Matlab 中,我使用了类似 Frangi 过滤(特征值过滤)的东西。任何人都可以提出好的处理算法来解决这样的表面上的异常检测吗?

编辑:添加了另一个带有标记异常的图像:

在此处输入图像描述

使用@Tapio 的顶帽过滤和对比度调整。由于@Tapio 为我们提供了如何增加表面异常对比度的好主意,就像我在开始时询问的那样,我向大家提供了我的一些结果。我有这样的图像: 在此处输入图像描述

这是我如何使用顶帽过滤和对比度调整的代码:

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

结果在这里:

在此处输入图像描述

仍然存在如何从最后一张图像中分割异常的问题?因此,如果有人知道如何解决它,那就接受吧!:) ??

4

3 回答 3

4

你应该看看底帽过滤。它被定义为原始图像的差异和图像的形态闭合,它使小细节,例如你正在寻找的那些闪光。

第一个图像对

第二个图像对

第三对图像

我调整了对比度以使两个图像都可见。在查看强度时,异常更加明显,并且更容易分割出来。

让我们看一下第一张图片:

需要分割精度

由于我使用的可视化工具引起的缩放,直方图值不代表现实。然而,相对距离确实如此。所以现在阈值范围更大了,目标从窗户变成了谷仓门。

全局阈值(强度 > 15):

全局阈值化后

Otsu 的方法在这里效果不佳。它将所有小细节分割到前景。

通过形态开放去除噪声后:

形态开放后

我还假设黑点是您感兴趣的异常。通过将阈值设置得较低,您可以包含更多的表面细节。例如第三张图片在我看来没有任何特别有趣的特征,但那是你判断的。就像 m3h0w 所说的那样,如果您的眼睛难以判断某件事,那么计算机可能无法判断,这是一个很好的启发式方法。

于 2017-02-27T17:13:35.407 回答
2

@ skoda23,我会尝试使用模糊部分的微调参数进行锐化掩蔽,以便强调高频并对其进行彻底测试,以免在此过程中丢失任何重要信息。请记住,期望计算机完成超人类的工作通常不是一个好主意。如果人类对异常在哪里有疑问,计算机将不得不这样做。因此,首先对图像进行预处理很重要,这样异常对于人眼来说是显而易见的。非锐化掩蔽(或添加)的替代方案可能是 CLAHE。但同样:记住要非常小心地对其进行微调 - 它可能会过多地突出电路板的纹理并干扰您的任务。

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

我的第二个猜测是首先对最暗的点使用固定值阈值,然后尝试 Sobel 或 Canny。应该存在一个最佳邻域,其中电路板的纹理不会那么亮,并且异常会。您还可以在边缘检测之前尝试模糊(如果您使用阈值检测到小缺陷)。

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

于 2017-02-27T08:37:33.933 回答
2

你基本上是在处理现实是模拟的不幸事实。阈值是一种将模拟范围转换为离散(二进制)范围的方法。任何阈值都可以做到这一点。那么,“足够好”的阈值到底是什么意思?

让我们暂时搁置这个想法。我看到很多异常现象——有点像灰色的细小蠕虫。显然,你忽略了它们。我应用的阈值与你不同。这可能是合理的,但您正在应用我没有的领域知识。

我怀疑这些灰色蠕虫会抛弃您的固定值阈值。这并不是说固定阈值的想法不好。您可以使用它来查找一些工件并排除它们。会遗漏一些较暗的斑块,但可以通过将每个像素替换为其邻域的中值,使用比这些蠕虫的宽度更大的邻域大小来消除。在黑暗的补丁中,这几乎没有作用,但它消除了小的局部变化。

我不假装这两种类型的异常是唯一的两种,但这确实是一个应用程序领域的问题,而不是关于技术的问题。例如,您似乎没有光照伪影(反射),至少在这 3 个样本中没有。

于 2017-02-27T11:36:12.777 回答