【问题标题】:Detecting weak blobs in a noise image检测噪声图像中的弱斑点
【发布时间】:2017-07-11 00:35:44
【问题描述】:

我的图像可能包含一些斑点。这些斑点可以是任意大小,有些会产生非常强的信号,而另一些则非常微弱。在这个问题中,我将重点关注弱点,因为它们是难以检测的。

这是一个包含 4 个 blob 的示例。

(480, 180) 处的斑点是最难检测的。通过运行高斯滤波器,然后进行开运算,对比度会增加一点,但不会很多:

这个问题的棘手部分是背景中的自然噪声会导致(许多)像素比我想要检测的斑点具有更强的信号。使 blob 成为 blob 的原因在于它要么是一个强度平均增加的大区域,(或者是一个强度增加非常强的小区域(此处不相关))。

如何包含此空间信息以检测我的 blob?

很明显,我首先需要使用高斯和/或中值滤波器对图像进行过滤,以便将每个像素的附近区域合并到每个单个像素值中。但是,再多的模糊也不足以轻松从背景中分割出斑点。

编辑:关于阈值: 阈值是非常临时的,但它本身也是有问题的。我没有“纯背景”区域,斑点越大,信号越弱 - 同时仍可检测到。

我也不应该认为典型图像根本没有任何斑点,而只是纯背景。

【问题讨论】:

  • 尝试阈值化,然后标记连接的组件,然后是形态开口以去除较小的组件(噪声)。
  • @MalcolmMcLean 我将在问题中澄清这一点。我发现(初始)阈值有问题,因为我不知道要使用哪个阈值。 1) 我不知道保证包含背景的区域。 2) 如果 blob 较大,它的信号可能会较弱。
  • 您是在寻找斑点的正确识别和位置,还是还需要精确的尺寸测量?
  • @SneakyPolarBear 只是正面识别和(大约)位置
  • 如果您尝试识别其他(情况)(即斑点低于背景值的情况,或单个像素高强度尖峰,如果您也发布这些图片...)

标签: image opencv image-processing computer-vision feature-detection


【解决方案1】:

您可以尝试 h-minima 变换。它消除了低于 h 高度的任何最小值,并将所有其他通道的高度增加了 h。它被定义为随着高度 h 增加的侵蚀的形态重建。这是 h = 35 的结果:

它应该更容易操作。它还需要像分割这样的输入。不同的是,这更健壮。将 h 低估一个相对较大的数字只会让您更接近原始问题图像,而不是完全失败。

假设无论您的应用程序是什么,它的数量都相对恒定,您可以尝试对背景噪声进行表征以获得估计值。

请注意,两个大底部斑点之间有一个蓝点。甚至需要进一步处理。您可以尝试继续使用形态学。我发现在一些像这样的“墨迹”分割案例中起作用的东西是遍历每个连接的组件,计算它们的凸包,最后计算图像中所有凸包的并集。它通常使进一步的形态学操作变得更加容易,并为标签提供了良好的估计。

【讨论】:

  • 谢谢,看起来很有趣。我会玩弄它
【解决方案2】:

根据我的经验,如果您可以看到您的高斯过滤器大小(那些小圆圈),那么您的过滤器宽度太小了。虽然非常昂贵,但请尝试提高高斯的半径,它应该会继续改善您的结果,直至其半径与您尝试查找的最小对象的半径相匹配。

之后(重高斯),我将对整个图像进行峰值搜索。剪掉任何太低的峰,或者与最近的山谷/背景对比度太小。

不要害怕将其拆分为两个独立的处理管道:即一个用于低对比度散布斑点的过滤和提取,另一个用于隔离高对比度尖峰(更容易找到)。话虽如此,即使是非常激进的滤镜,高对比度尖峰“应该”仍然存在。要记住的另一件事是迭代减法,如果从一开始就可以轻松找到一些斑点,请将它们从图像中拉出然后进行拉伸(但要小心,因为您可以使图像成为您想要的任何东西过度拉伸)

【讨论】:

  • 谢谢。首先,大量增加高斯滤波器确实可以改善这种情况。但是,当我真的没有“最小的对象”时,我该如何处理呢?我最小的物体非常依赖对比度。如果对比度很大,我可以检测到小于一个像素的物体(一个或两个像素会非常亮),如果对比度很差(就像在这种情况下),物体显然需要大得多才能可见。
  • 好吧,我必须假设您的小物体(如果可检测到)具有非常高的对比度(否则它们与您的背景噪音无法区分)。
  • 虽然将高斯滤波器设置为您的目标大小很好,但归根结底,它只需要大到足以消除您的噪音,所以也许对您最坏的情况进行一些分析案例噪声并基于此设置您的高斯滤波器。高斯过滤器不应该让你的对象更难找到,直到它超过它的大小。
  • 您可以采用迭代方法。您通过第一次通过并拉出您可以看到的任何物体的地方(超亮高对比度)。然后迭代地应用越来越大的高斯过滤器,直到您对只剩下噪声感到满意为止。
【解决方案3】:

也许尝试使用阈值和边缘检测的迭代方法:

从一个非常高的阈值开始(比如 90% 的信号),然后在阈值图像上运行一个 canny 过滤器(或您喜欢的任何二元边缘过滤器)。统计并存储生成的像素(边缘像素)个数。

继续重复此步骤以获得越来越低的阈值。在某个时刻,您将看到检测到的边缘出现大量峰值(即您的酷纹理背景)。然后将阈值拉高一点,并在生成的边缘图像上运行关闭和填充。

【讨论】:

    猜你喜欢
    • 2017-05-04
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多