使用openCV细化图像中的线条

信息处理 图像处理 计算机视觉 opencv
2022-01-27 21:54:42

在我的项目中,我使用 openCV2 提取图像的线条,首先创建一个骨架:我将其转换为二进制图像,将其反转(使其与形态学运算一起工作),然后执行一堆形态学运算。然后我在骨架上应用精明边缘检测器并执行霍夫变换。

现在是重要的部分:为了消除差距,我执行了关闭操作。我现在的问题是仍然存在一些差距和碎片,我不能再应用一次关闭操作,因为它是幂等的(只适用一次)。

我想通过缩小所有间隙并可能加粗线条来细化线条。我怎样才能做到这一点?

这里有一些图片来说明我的问题。

原始图像

原来的

处理后的图像

处理

看到那些从边缘突出的细小线条了吗?还是直线上的中断?
对于我考虑循环遍历矩阵的行中的间隙,如果像素的左右点为 1(绘制),那么该特定像素也应设置为 1。这会是一个好的解决方案吗?

2个回答

如果您试图在霍夫变换期间消除间隙,您minLineLength可以maxLineGapcv2.HoughLinesP()

编辑

形态学运算的一些结果:

在此处输入图像描述

可能这会有所帮助。

  1. 获取骨架图像。
  2. 查找图像中垂直方向的连续前景像素,其上一列或下一列的所有背景像素都在行程范围内。这将给出需要处理的点的位置。
  3. 对于每个点,找到最近的陡峭点。这将是一个分支点或发生角度突然变化的点。(上一个答案的图像中的示例点 15)。如果没有这样的点,显然还有另一个终点。将这些称为参考点。端点和参考点之间的向量将给出延伸方向。
  4. 现在可以有多种方法来决定加入哪个点。您可以在该方向上取最近的前景点。您还可以根据端点和扩展点之间的角度和距离选择一些特征,以在 KNN 分类器中使用。

希望能帮助到你。