python - 给定 OpenCV/Python 中 'S' 形状边缘的轮廓,可以使用什么方法沿着形状的中心追踪曲线?

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

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

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

enter image description here

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

enter image description here

下面是漫画无字母表:

enter image description here

骨架化的另一个问题是它的计算成本很高,但如果您知道一种方法可以使其稳健地形成像 Twig 一样的“蛇舌”,那么我会试一试。

最佳答案

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

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

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

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

enter image description here

最小二乘拟合示意图:

enter image description here

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

此方法如本 paper 中所述非常复杂,但却是可用于显示矢量字体的最佳算法之一:

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

enter image description here

关于python - 给定 OpenCV/Python 中 'S' 形状边缘的轮廓,可以使用什么方法沿着形状的中心追踪曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21867701/

相关文章:

python - Azure blob 触发器错误 :The condition specified using HTTP conditional header(s) is not met

python - cv2.videowriter 写入 0 字节文件 (python) (opencv)

python - 从图像中查找车轮中的辐条总数 - OpenCV (Python)

matlab - 为什么这个傅立叶逆变换没有给出正确的结果?

python - MAC OS X Pebble SDK 3.0 构建错误 : Compilation error InverterLayer

python - 通过多个内核在 Jupyter Notebook 上运行多个 Python 版本(2.x、3.y、3.z)

Python图像调整大小并使用相同的名称写入

opencv - 根据颜色选择 'Region of Interest'并确定对象的形状

python - 在opencv + python中处理帧时实时流被延迟

python - venv 中的 pip 版本不匹配