【发布时间】: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