【问题标题】:Given a contour outlining the edges of an 'S' shape in OpenCV/Python, what methods can be used to trace a curve along the center of the shape?给定在 OpenCV/Python 中勾勒出“S”形边缘的轮廓,可以使用哪些方法沿着形状的中心绘制曲线?
【发布时间】:2014-02-18 23:23:07
【问题描述】:

给定一个勾勒出字母 S 边缘的轮廓(例如,在漫画 sans 中),我怎样才能沿着这个字母的脊椎获得一系列点,以便以后使用线条、三次样条或其他曲线来表示这个形状- 代表技术? 我想在 Python/OpenCV 中使用 30-40 个点来处理和表示形状。

形态骨架化可以帮助解决这个问题,但该操作似乎总是会产生错误的分支。有没有更好的方法将轮廓折叠成字母的“S”形?

在下面的示例中,您可以看到由形态骨架化产生的错误的“蛇舌”状分支。如果这是算法应该做的事情,我不知道说他们是错误的是否公平,但对我来说,我不希望他们在那里。

以下是无字母的漫画:

骨架化的另一个问题是它的计算成本很高,但如果你知道一种使它能够健壮地形成像树枝一样的“蛇舌”的方法,那么我会尝试一下。

【问题讨论】:

  • 您的意思是要“矢量化字符”吗?或“使用样条表示骨架”?
  • 两者都会有帮助!据我了解,贝塞尔曲线在矢量图形中用于制作贝塞尔样条曲线。我认为对于上面使用单个三次样条表示的某些字符可能很困难 - 这就是为什么我以字母“S”开始问题。一开始即使是折线也可以...
  • 图细化有一些简单的技巧。形成上述图表后,您可以剔除在一定距离之前未达到 n 分叉 (n>2) 的节点。
  • 我不是专家,但距离变换(见docs.opencv.org/2.4.7/modules/imgproc/doc/…)对你想做的事情有帮助吗?
  • @AldurDisciple,我试过了,但似乎需要进一步处理,因为结果不是连接曲线。

标签: python opencv image-processing computer-vision morphological-analysis


【解决方案1】:

实际上矢量化字体并不是一个小问题,而且相当棘手。要使用贝塞尔曲线正确矢量化字体,您需要跟踪。您可以使用许多库来跟踪图像,例如Potrace。我不熟悉使用 python,但根据我的经验,我使用 c++ 完成了类似的项目,如下所述:

A.使用三次贝塞尔曲线拟合轮廓

这个方法很简单,虽然需要做很多工作。我相信如果您想拟合从细化中获得的骨骼,这也很有效。

  1. 寻找物体的轮廓/边缘,可以使用OpenCV函数findContours()
  2. 无法使用单个三次贝塞尔曲线来表示整个形状,因此请使用Ramer-Douglas-Peucker (RDP) 将它们分成几段。这一步重要的是,不要删除任何点,仅使用 RDP 来分割点。请参阅下图中的彩色部分。
  3. 对于每个段,其中 S 是一组 n 个点 S = (s0, s1,...Sn),拟合三次贝塞尔曲线使用Least Square Fitting

最小二乘拟合说明:

B.分辨率分辨率独立曲线渲染

paper 中描述的这种方法相当复杂,但却是可用于显示矢量字体的最佳算法之一:

  1. 寻找轮廓(同方法A)
  2. 使用 RDP,与方法 A 不同的是,使用 RDP 去除点以便简化轮廓。
  3. 进行 delaunay 三角测量。
  4. 使用论文中描述的方法在外边缘绘制贝塞尔曲线

【讨论】:

  • 感谢您的回答 - 我会尝试这些。 rdp 可能是一个非常有用的算法,所以我将尝试在 python 中实现。
【解决方案2】:

以下简单的想法可能有用。

  1. 计算外轮廓的中轴。这将确保曲线的连通性。

  2. 找出分支点。根据其长度,您可以删除它们以消除“蛇舌”问题。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2019-03-28
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2014-05-21
    • 2014-04-29
    相关资源
    最近更新 更多