给定轮廓勾勒出OpenCV/Python中'S'形状的边缘,可以使用哪些方法沿形状中心追踪曲线?

use*_*339 3 python opencv image-processing computer-vision morphological-analysis

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

形态骨架化可能有助于此,但操作似乎总是产生错误的分支.有没有更好的方法将轮廓折叠成字母的'S'形状?

在此输入图像描述

在下面的例子中,您可以看到错误的"蛇的舌头",就像形态骨架化产生的分支一样.我不知道如果这是算法应该做的事情是否错误是公平的,但对我来说,我不希望他们在那里.

在此输入图像描述

以下是漫画sans字母:

在此输入图像描述

骨架化的另一个问题是它的计算成本很高,但是如果你知道一种方法可以使它像分支一样形成"蛇舌",那么我会尝试一下.

aze*_*r89 5

实际上,矢量化字体并非易事,而且相当棘手.要使用贝塞尔曲线正确地矢量化字体,您需要跟踪.您可以使用许多库来跟踪图像,例如Potrace.我不是很了解使用python,但根据我的经验,我使用下面描述的c ++完成了类似的项目:

A.使用立方贝塞尔曲线拟合轮廓

虽然应该做很多工作,但这种方法很简单.我相信如果你想要适应从细化中获得的骨骼,这也很有效.

  1. 找到对象的轮廓/边缘,可以使用OpenCV函数findContours()
  2. 整个形状不能用单个立方贝塞尔表示,因此使用Ramer-Douglas-Peucker(RDP)将它们分成几个部分.在这一步中重要的是,不要删除任何点,只使用RDP来分割点.请参阅下图中的彩色片段.
  3. 对于每个段,其中S是一组n个点S =(s0,s1,... Sn),使用最小二乘拟合拟合一个三次贝塞尔曲线

在此输入图像描述

最小二乘拟合的插图:

在此输入图像描述

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

如在此描述的该方法中纸张是非常复杂,但提供给显示矢量字体最佳算法之一:

  1. 查找轮廓(与方法A相同)
  2. 使用RDP,与方法A不同,使用RDP删除点,以便简化轮廓.
  3. 做delaunay三角测量.
  4. 使用本文中描述的方法在外边缘绘制贝塞尔曲线

在此输入图像描述