在二值化图像中分离交叉段

Posted

技术标签:

【中文标题】在二值化图像中分离交叉段【英文标题】:Separate crossings segments in binarised image 【发布时间】:2020-04-17 17:15:23 【问题描述】:

我有一些图像处理允许我提取包含厚段的二进制图像,我面临这些段可能相互交叉的问题。因此我需要找到一种有效的方法来分离它们,我必须在 C++ 中实现它,所以任何基于 OpenCV 的东西都会有所帮助。 这是一个示例输入图像,两个“blob”都需要分成 3 个不同的部分。

到目前为止,我已经尝试了 2 个想法,但我都被这两个想法所困扰,这就是为什么我在这里询问是否有任何“最先进”的解决方案可以解决这个看似简单的问题。

    我的第一个想法是计算斑点的骨架,找到交点。这部分很容易。然后我计划从一个终点开始,穿过路段,直到我到达一个十字路口并“穿过十字路口”。如果您查看底部的斑点,即使预期为“T”形,骨架也会产生奇怪的“Y”形,从而无法决定如何穿过交叉路口。

    第二个想法是计算距离变换,然后是梯度方向,然后我仍然需要一种方法来合并具有相似方向的像素以及一种处理端点/交叉点的方法。

【问题讨论】:

您可以从Harris Corner Detection 开始寻找交叉点。这是一个 MATLAB 执行 result。当距离很近时,您可以尝试跨越两个相近的交叉点“关键点”。对于“T”形,它看起来很直。对于 X 形状,您可以搜索几乎平行的两条线。 你尝试过霍夫变换来提取线条吗? @Rotem 这会给我带来交叉点,就像我对我的骨架所做的那样,接下来我该怎么做才能单独提取每个片段? @Meisam 不,我没有尝试过霍夫变换,你认为它有什么帮助?据我所知,它不会返回分隔行 通过适当地设置霍夫的阈值,它可以分别为您提供每条线方程的估计值(即使它们相交)。通过这种估计和一些简单的形态学操作,您可以将它们彼此独立地分割。 【参考方案1】:

使用骨架是个好主意,因为这将使处理独立于笔画宽度。在一个路口附近,骨骼受到扰动,从而局部改变方向。

您可以考虑一个骨架并在连接点处拆分(连接到两条以上的独立曲线)。您将构建一个图形,其中边是连接点之间的弧。确保保持连接性。

然后,您可以通过找到距离交界处一到二厚的点来估计弧的方向。您将对边缘进行配对,以使(绿色)点形成最佳对齐方式。您可以贪婪地执行此操作(首先是最佳拟合),直到用尽所有可能的匹配项或直到角度被认为太大。

大角度的交叉路口具有挑战性,因为它们会形成一个具有两个遥远交叉点的骨架。在将一条曲线与另一条曲线匹配时,您可能会考虑与较远的曲线进行匹配,前提是两者之间有一条路径,以便它适合与笔划一样大的条纹。

【讨论】:

非常感谢您的建议。您对存储和遍历每条曲线的结构有什么建议吗?就像一种从 OpenCV 创建的骨架中提取链表的方法 @JulienM:这只是一个图表。

以上是关于在二值化图像中分离交叉段的主要内容,如果未能解决你的问题,请参考以下文章

用opencv如何将一个二值化图像反色

图像的自适应二值化

二值化

图像灰度化、二值化理解

二值化处理与边缘检测

如何用C语言实现对图像的二值化?