image - 二值化图像中的单独交叉线段

标签 image opencv image-processing vision

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

input image

到目前为止,我已经尝试了 2 个想法,但我一直坚持这两个想法,这就是为什么我在这里询问是否有任何“最先进”的解决方案来解决这个看似简单的问题。

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

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

image transform original and transform overlapped

最佳答案

使用骨架是个好主意,因为这将使处理独立于笔划宽度。在连接点附近,骨架受到扰动,导致方向局部改变。

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

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

enter image description here

enter image description here

广角交叉点具有挑战性,因为它们将形成具有两个遥远交叉点的骨架。将一条曲线与另一条曲线匹配时,您可以考虑与远处的曲线进行匹配,前提是其间有一条路径,以便它适合与笔画一样大的条纹内。

关于image - 二值化图像中的单独交叉线段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59505748/

相关文章:

android - 如何在保持透明背景的同时转换图像中的 LinearLayout

image - 处理滤镜和颜色

c# - 如何在 Emgucv 中设置多 channel 矩阵的值

ios - 在 swift 数据模型中使用来自 objective-c++ 框架的数据类型

image-processing - 图像处理 - 平滑

jquery - 在图像覆盖的 header 标记内带有顶部边距的带边框的文本标题

c++ - OpenCV 中的 Matlab Conv2 等效项

python - 使用 Keras 进行数据增强

机器人 : Display image in imageview from another imageview source?

python - 如何在 Keras 中实现 Salt&Pepper 层?