【问题标题】:Robust tracking of blobs强大的斑点跟踪
【发布时间】:2014-02-08 15:34:48
【问题描述】:

我有一个图像特征提取问题。输入图像是二进制的(黑白),可能包含近似已知面积和纵横比的斑点。这些需要使用一些最佳拟合算法与椭圆拟合。

示例输入:

期望的输出:

可能有多个 blob(零个或多个),其数量事先不知道。所有斑点的近似面积和纵横比是已知的(并且是相同的)。图像中有多少,它们的位置,方向和实际大小是我想要找到的。根据实际找到的大小和纵横比,输出应该是每个 blob 的最佳拟合椭圆。

让这变得困难的是噪音和可能的重叠。

噪声示例:

重叠和噪声示例:

嘈杂的图像可能在斑点中有孔,并且散布在周围的其他小斑点。其他小的斑点没有被计算在内,因为它们太小并且没有覆盖任何密集到足以被视为真正匹配的区域。

重叠的图像应计为两个斑点,因为该区域太大,单个斑点无法很好地覆盖它。

评估潜在契合度的可能指标是:

所有椭圆的总和(K1 * 与预期尺寸的偏差百分比 + K2 * 与预期纵横比的偏差百分比 + K3 * 非黑色椭圆的百分比 + K4 * 与任何其他椭圆重叠的百分比)+ K5 * 的百分比其余图像为黑色

for some suitably chosen parameters K1..K5.完美匹配得分为 0。

我可以看到如何使用蛮力解决这个问题,例如尝试足够多的不同可能拟合来很好地对搜索空间进行采样。我想不出比蛮力更快的方法。

我更喜欢 python 和/或 opencv 中的示例。我将尝试在 python 中实施和发布任何建议的解决方案。谢谢!

附:不能假设 blob 是连接的。可能有足够的噪音将其分解成不连续的部分。

附言二进制腐蚀无法去除微小的噪声。在我的一些图像中,如果图像被腐蚀到足以使噪声位也消失,则有足够的内部孔洞使整个(真实)斑点消失。

P.P.P.S.我认为使用任何基于轮廓的方法都很难解决这个问题。我在实践中看到的数据有太多的边缘噪声,可能(并且经常有)一些噪声连接单独的 blob,或者将单个 blob 分成几个(明显的)连接组件。我想要一种基于区域的方法,因为区域覆盖范围似乎比边缘形状少得多。

P.P.P.P.S.根据要求,这里是一个由于噪音而导致穿透的示例:

还有一个样本有很多噪音,但仍然是一个明显的斑点:

编辑没有一个答案能真正解决问题,尽管 Bharat 提出了一个部分解决方案,该解决方案适用于非重叠 blob。更多请:) 我将奖励任何实际解决方案。

【问题讨论】:

  • 如果您有每个 blob 的大致大小和位置(来自上一个跟踪步骤或初始检测),您可能需要查看 active contours。它们从轮廓(给定的大小和位置)开始,并尝试适应呈现轮廓(在图像中)而不会变形太多。这些用于医学 CT 扫描的文献中,其中器官的大小/位置/方向在不同扫描之间可能略有不同。 OpenCV 有一个snake 实现,但不确定它是否仍然是上一个版本,因为它不是很好。
  • @Alex我试过放大/缩小有噪声的例子吗,我认为放大二进制图像几乎可以消除所有的噪声-虽然不确定-
  • 您是否考虑过一些启发式方法,例如最大化每个椭圆中包含的区域?如果您事先知道每个 blob 的大致大小/形状,我想您可以在图像上移动椭圆并根据 ellipse_area-filled_in_pixels 最小化。
  • @Chrismit:是的,我在问题中描述了适合度数。优化不是特别快:)

标签: python opencv computer-vision feature-extraction


【解决方案1】:

我会尝试拟合高斯混合模型,然后使用均值和协方差矩阵在数据上拟合椭圆。即使有重叠和小的嘈杂斑点,这样的模型也可以工作。您拥有的数据将是黑色像素的坐标,您可以在数据上拟合 GMM。这种方法的一个问题是您需要提前知道需要跟踪的 blob 数量,如果您可以为此提出启发式方法,GMM 应该可以非常有效地解决这个问题。

【讨论】:

  • 谢谢,我用sklearn.mixture.GMM 试过了。它在非噪声输入上没问题,噪声稍微差一点,并且被重叠的斑点混淆,因为它试图找到两个不重叠的高斯图像可能是图像的总和,通常一个高斯覆盖了两个重叠的大部分斑点,第二个小得多的斑点覆盖了其余部分。我想要的不是高斯的总和,而是“高斯的最大值”:) 也没有办法暗示预期的 blob 大小。
  • 如果您要随着时间的推移进行跟踪,那么有一些更好的方法可以做到这一点,对于单个图像,您甚至可以查看均值偏移/内核密度估计,因为您对图像的大小有所了解对象
  • Bharat:我正在做随时间推移的跟踪,但我认为如果每个单独的识别都是 100% 准确的,那么随着时间的推移部分将非常容易:) 你能解释一下“平均偏移/核密度估计”吗?是的,对象的大小已知为 +/-20%,只要它没有部分超出视野或被遮挡。
  • 也就是说,您能否提出更好的方法来做到这一点,这些方法依赖于随着时间的推移使用一系列图像?
  • comaniciu.net/Papers/MsTracking.pdf 这是论文。这是一个关于它的教程cse.psu.edu/~rcollins/CSE598G/introMeanShift.pdf这可能需要一些时间来阅读
【解决方案2】:

填充孔[1],检测轮廓[2],并使用每个轮廓矩形上的矩来查找方向、偏心率等[3]

PS.:断开的轮廓(噪声)可以按大小过滤掉。

【讨论】:

  • 很有趣,但有些孔可能会一直穿过,因此按大小过滤生成的轮廓会错误地丢弃真实斑点的两半。
  • 您可以发布一个示例(“一路跨越”案例)吗? dilation 会解决这个问题吗?
  • William:我发布了几个示例,请参见上文。我认为一般来说,最好不要将图像视为二元图像——它太嘈杂了——而是从连续概率密度函数中提取的离散样本。例如。只需取一个高斯(半径 60-100 左右)并将斑点安装到较暗的区域。阈值高斯看起​​来不错,但我认为这会丢失一些信息。
  • 您的最后一个示例非常具有挑战性,我不知道是否有可靠的答案。可能,我会从元启发式(如粒子群优化)开始,以尽量减少贪婪搜索的计算负担。
【解决方案3】:

您可以先过滤掉contours by area

关于分离重叠的斑点,这可能是一个棘手的问题(我敢说,任意重叠是不可能的)来处理这个二进制图像,也许你应该用原始图像来做,或者至少退一步-处理。

OpenCV 的 fittEllipse 也会有所帮助。

【讨论】:

  • 为了解决重叠问题,如果图像中的某个区域大于允许的最大 blob,我希望将其检测为两个 blob(具有合理的方向/大小)。所以没有歧义,任何大约一个blob大小的东西都是一个blob,任何更大的东西都是两个(或更多)blob,任何更小的东西都不是一个blob。因此最后一个例子,那绝对是两个 blob。我认为轮廓很难同时处理重叠的斑点和斑点中的孔,这些斑点足够大,以至于斑点似乎被分成两部分。
  • 如果对象被分成两部分,您的预处理可能需要调整,或者您必须考虑一个完全不同的程序恕我直言,因为很难区分噪音和分离的部分以及该部分属于哪个对象。
  • 瑞,是的,也许这是真的。我认为考虑面积密度比二元连接组件更有帮助;区域密度是正确的,例如,如果使用一些相当激进的低通滤波器处理二值图像。
【解决方案4】:

这不是一些基本的编程问题,这涉及到高级图像处理技术。据我所知,“图像处理,形态”是您的目标点。您可以参加一些“图像形态学”课程,了解“膨胀、侵蚀”等基本结构……然后您就掌握了解决这个问题的基础知识。

【讨论】:

    【解决方案5】:

    既然你有大小和方向,你可以画每个椭圆,并使用模板匹配。

    tutorial here.

    【讨论】:

    • Eran,谢谢你,很遗憾我没有方向。我只有大概的尺寸。
    • 那么什么是“纵横比”?
    • 它是椭圆的长轴和短轴之间的比率,或者如果您愿意,它是拉长的。我不知道它向哪个方向拉长,或者哪个方向是长方向。
    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2010-12-09
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多