【发布时间】:2020-04-17 17:15:23
【问题描述】:
我有一些图像处理允许我提取包含厚段的二进制图像,我面临这些段可能相互交叉的问题。因此我需要找到一种有效的方法来分离它们,我必须在 C++ 中实现它,所以任何基于 OpenCV 的东西都会有所帮助。
这是一个示例输入图像,两个“blob”都需要分成 3 个不同的部分。
到目前为止,我已经尝试了 2 个想法,但我都被这两个想法所困扰,这就是为什么我在这里询问是否有任何“最先进”的解决方案可以解决这个看似简单的问题。
我的第一个想法是计算斑点的骨架,找到交点。这部分很容易。然后我计划从一个终点开始,穿过路段,直到我到达一个十字路口并“穿过十字路口”。如果您查看底部的斑点,即使预期为“T”形,骨架也会产生奇怪的“Y”形,从而无法决定如何穿过交叉路口。
第二个想法是计算距离变换,然后是梯度方向,然后我仍然需要一种方法来合并具有相似方向的像素以及一种处理端点/交叉点的方法。
【问题讨论】:
-
您可以从Harris Corner Detection 开始寻找交叉点。这是一个 MATLAB 执行 result。当距离很近时,您可以尝试跨越两个相近的交叉点“关键点”。对于“T”形,它看起来很直。对于 X 形状,您可以搜索几乎平行的两条线。
-
你尝试过霍夫变换来提取线条吗?
-
@Rotem 这会给我带来交叉点,就像我对我的骨架所做的那样,接下来我该怎么做才能单独提取每个片段?
-
@Meisam 不,我没有尝试过霍夫变换,你认为它有什么帮助?据我所知,它不会返回分隔行
-
通过适当地设置霍夫的阈值,它可以分别为您提供每条线方程的估计值(即使它们相交)。通过这种估计和一些简单的形态学操作,您可以将它们彼此独立地分割。
标签: image opencv image-processing vision