给定一个勾勒出字母 S 边缘的轮廓(例如,在漫画中),我怎样才能沿着该字母的脊柱获得一系列点,以便稍后使用直线、三次样条或其他曲线表示技术来表示该形状?我想在 Python/OpenCV 中使用 30-40 个点来处理和表示形状。
形态骨架化可以对此有所帮助,但该操作似乎总是会产生错误的分支。有没有更好的方法将轮廓折叠成字母的“S”形状?
在下面的示例中,您可以看到由形态骨架化产生的错误的“蛇舌”状树枝。我不知道如果算法应该这样做的话,说它们是错误的是否公平,但对我来说,我不希望它们在那里。
以下是无字母的漫画:
骨架化的另一个问题是它的计算成本很高,但如果你知道一种方法让它能够鲁棒地形成像树枝一样的“蛇舌”,那么我会尝试一下。
实际上,矢量化字体并不是一个小问题,而且相当棘手。要使用贝塞尔曲线正确矢量化字体,您需要跟踪。有许多库可用于跟踪图像,例如Potrace http://potrace.sourceforge.net/。我不了解如何使用 python,但根据我的经验,我使用 c++ 完成了类似的项目,如下所述:
A. 使用三次贝塞尔曲线拟合轮廓
尽管需要做很多工作,但该方法非常简单。我相信如果你想拟合通过细化获得的骨架,这也很有效。
- 寻找物体的轮廓/边缘,可以使用OpenCV函数查找轮廓() http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html
- 整个形状无法使用单个三次贝塞尔曲线表示,因此使用以下方法将它们分成几个部分拉默-道格拉斯-普克 (RDP) http://karthaus.nl/rdp/。这一步中重要的是,不要删除任何点,仅使用 RDP 来分割点。请参阅下图中的彩色部分。
-
对于每个段, where S是n个点的集合S = (s0, s1,...Sn),使用三次贝塞尔曲线拟合最小二乘拟合 http://jimherold.com/2012/04/20/least-squares-bezier-fit/
最小二乘拟合示意图:
B. 分辨率与分辨率无关的曲线渲染
此方法如本中所述paper http://research.microsoft.com/en-us/um/people/cloop/LoopBlinn05.pdf非常复杂,但是可用于显示矢量字体的最佳算法之一:
- 查找轮廓(与方法A相同)
- 使用RDP,与方法A不同,使用RDP去除点,从而可以简化轮廓。
- 进行德劳内三角测量。
- 使用论文中描述的方法在外边缘绘制贝塞尔曲线
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)