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?

↘锁芯ラ 提交于 2019-12-03 05:02:05

Actually vectorizing fonts isn't trivial problem and quite tricky. To properly vectorize fonts using bezier curve you'll need tracing. There are many library you can use for tracing image, for example Potrace. I'm not knowledgeable using python but based on my experience, I have done similar project using c++ described below:

A. Fit the contour using cubic bezier

This method is quite simple although a lot of work should be done. I believe this also works well if you want to fit skeletons obtained from thinning.

  1. Find contour/edge of the object, you can use OpenCV function findContours()
  2. The entire shape can't be represented using a single cubic bezier, so divide them to several segments using Ramer-Douglas-Peucker (RDP). The important thing in this step, don't delete any points, use RDP only to segment the points. See colored segments on image below.
  3. For each segments, where S is a set of n points S = (s0, s1,...Sn), fit a cubic bezier using Least Square Fitting

Illustration of least square fitting:

B. Resolution Resolution Independent Curve Rendering

This method as described in this paper is quite complex but one of the best algorithms available to display vector fonts:

  1. Find contour (the same with method A)
  2. Use RDP, differently from method A, use RDP to remove points so the contour can be simplified.
  3. Do delaunay triangulation.
  4. Draw bezier curve on the outer edges using method described in the paper

The following simple idea might be usefull.

  1. Calculate Medial axis of the outer contour. This would ensure connectivity of the curves.

  2. Find out the branch points. Depending on its length you can delete them in order to eliminate "serpent's tongue" problem.

Hope it helps.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!