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

2024-03-25

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

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

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

以下是无字母的漫画:

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


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

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

尽管需要做很多工作,但该方法非常简单。我相信如果你想拟合通过细化获得的骨架,这也很有效。

  1. 寻找物体的轮廓/边缘,可以使用OpenCV函数查找轮廓() http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html
  2. 整个形状无法使用单个三次贝塞尔曲线表示,因此使用以下方法将它们分成几个部分拉默-道格拉斯-普克 (RDP) http://karthaus.nl/rdp/。这一步中重要的是,不要删除任何点,仅使用 RDP 来分割点。请参阅下图中的彩色部分。
  3. 对于每个段, 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非常复杂,但是可用于显示矢量字体的最佳算法之一:

  1. 查找轮廓(与方法A相同)
  2. 使用RDP,与方法A不同,使用RDP去除点,从而可以简化轮廓。
  3. 进行德劳内三角测量。
  4. 使用论文中描述的方法在外边缘绘制贝塞尔曲线
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • Python设置1和True的解释

    在 IPython 3 交互式 shell 中 In 53 set2 1 2 True hello In 54 len set2 Out 54 3 In 55 set2 Out 55 hello True 2 是因为 1 和 True 得到
  • 计算熊猫数据帧几个月的总和

    我有一个 pandas 数据框 如下所示 ID Year R1 R1 f KAR1 20201001 1 5 KAR1 20201101 2 6 KAR1 20201201 3 7 KAR1 20210101 4 8 KAR1 202102
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 在 PhotoImage 下调整图像大小

    我需要调整图像大小 但我想避免使用 PIL 因为我无法使其在 OS X 下工作 不要问我为什么 无论如何 因为我对 gif pgm ppm 感到满意 所以 PhotoImage 类对我来说没问题 photoImg PhotoImage fi
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • Pandas如何按时间段过滤DataFrame

    我有一个包含下表的文件 Name AvailableDate totalRemaining 0 X3321 2018 03 14 13 00 00 200 1 X3321 2018 03 14 14 00 00 200 2 X3321 20
  • Bokeh 中单独的节点和边缘悬停工具?

    我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示 但未能使其正常工作 有人可以指出我做错了什么吗 我相信代码应该如下所示 from bokeh io import show output notebook from bokeh
  • 使用 Windows 任务计划程序安排 [Virtualenv 相关] Python 脚本

    I want to schedule a python script to start at 3AM and break at 5PM every weekday However the problem arises when I need
  • 导入目录下的所有模块

    有没有办法导入当前目录中的所有模块 并返回它们的列表 例如 对于包含以下内容的目录 mod py mod2 py mod3 py 它会给你
  • 错误:尝试使用 scrappy 登录时出现 raise ValueError("No element found in %s" % response)

    问题描述 我想从我大学的bbs上抓取一些信息 这是地址 http bbs byr cn http bbs byr cn下面是我的蜘蛛的代码 from lxml import etree import scrapy try from scra
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 更新 matplotlib 中颜色条的范围

    我想更新一个contourf在函数内绘制 效果很好 然而 数据的范围发生了变化 因此我还必须更新颜色条 这就是我未能做到的地方 请参阅以下最小工作示例 import matplotlib pyplot as plt import numpy
  • 如何在 Python 中跟踪日志文件?

    我想在 Python 中提供 tail F 或类似内容的输出 而无需阻塞或锁定 我找到了一些非常旧的代码来做到这一点here http code activestate com recipes 436477 filetailpy 但我认为现
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • 更改用作函数全局作用域的字典

    我想做一个 purePython 的装饰器 其中一部分是能够有选择地禁止访问函数的全局范围 有没有一种方法可以以编程方式更改哪个字典事物充当函数的全局 外部作用域 因此 例如在下面我希望能够拦截对f in h并抛出错误 但我想允许访问g因为
  • 避免“散点/点/蜂群”图中的数据点重叠

    使用绘制点图时matplotlib 我想偏移重叠的数据点以使它们全部可见 例如 如果我有 CategoryA 0 0 3 0 5 CategoryB 5 10 5 5 10 我想要每一个CategoryA 0 数据点并排设置 而不是彼此重叠

随机推荐