边缘检测器检测到的连接边缘

信息处理 计算机视觉 边缘检测
2021-12-22 03:43:13

我有一个从精明边缘检测器获得的二进制图像。在中心没有很好地检测到边缘,我需要加入它们。边的连接取决于方向和邻域。如果顶点低于阈值(比如小于 5 像素距离),我需要连接顶点。如果我的几乎线性特征很好地定向,这个阈值应该放宽。(这是最好的情况。) 图片

我尝试了霍夫变换,但它对我不起作用,因为我没有直线。膨胀和腐蚀也不好;他们使图像更混乱。

我正在尝试的方法是首先检测顶点和节点(在 MATLAB 中使用bwmorph),然后将叶子作为单独的特征。这是按如下方式完成的:

  1. 在 3x3 窗口中扫描,寻找邻居。
  2. 遍历完整的连接对象。
  3. 尝试拟合一条线(或者可能是二次多项式)。
  4. 逐个检查功能是否值得连接。

实现并不简单,因为需要连接顶点的决策部分很棘手。

2个回答

这可能不是完整的解决方案,但会给你很好的方向。

基本上,说边缘匹配的关键标准是什么?“局部”边缘的梯度匹配,并且在某种程度上,距离对于边缘连续的长度是合理的。

如果您有几何边缘,例如长直线,Hough 将立即完成非常无缝的工作。但是当边缘是任意曲线时,这不起作用。在这种情况下,您仍然可以将曲线视为大致分段的常数段(在您的情况下已经足够好了),因此,您应该在本地使用 Hough。即你可以取一小部分图像(比如一个块)计算霍夫并识别一些峰值。基于此,您可以确定去霍夫正在创造有意义的差距,如果是这样,请保持或继续前进。

一旦较小的间隙被填满,您可以扩展它以占用更大的尺寸。峰值会更多,但您可以从中选择更少。

这确实不会很简单......您可以尝试完全使用 Graph 结构。首先从图像中提取所有连接的像素,并将它们插入到相邻节点与边缘连接的 Graph 中。您可以丢弃小于 M 节点数的图(以排除与图像无关的小点)。

在此过程结束时,您将拥有一组断开连接的图表。(从你的图片来看,这些不完全是树,因为那里有循环)

您可以通过从某个随机节点开始并执行DFS来找到每个 Graph 的极值点(每个 Graph 外围的极值像素) 。

在此过程结束时,您将获得每个 Graph 的一组像素坐标,这些坐标对应于更可能形成连接的极值点。

您现在可以尝试简单地用直线连接最近的极值点邻居(距离 <=5)。

但是,如果您想考虑导致该极值像素的线段的斜率,您可以在到达该极值像素之前尝试将一条线“拟合”到 N 个像素。因此,如果 N = 5,则分支的最后 5 个像素将用于估计一条线。

因此,对于每个最近邻对,您现在还可以使用另一件事作为判断两个线段是否应连接的标准(即极值点距离 <=5 像素和近似相等的线斜率)。

为了尽量减少可能使您的线在分支尖端附近出现锯齿状的影响(并因此扭曲您的斜率估计),您可以尝试对您的图表应用一个简化步骤(这是另一个点(除了上面的 DFS)它支付使用 Graph 结构)。例如,您可以删除图形的后续节点,这些节点会使线以大于某个截止值的角度“弯曲”(对于更复杂的情况,请参见此处)。通过这种方式,您将拟合“更简单”的线条,大致适合由图像像素形成的大部分片段的方向。

在大多数情况下,这可能会产生良好的联系(从您发布的图片来看),但它仍然会给您留下一些具有挑战性的问题。例如,其中一个分支在连接点附近被中断的“Y”形中断模式如何连接?(即,您有一个“连续”弯曲,必须与与其“混合”的线段连接)。也许您可以查看此类情况的常见程度,并稍后修改您的连接标准。

此外,也许值得研究如何改进图像采集(例如提高分辨率)。