【问题标题】:Vectorizing an image矢量化图像
【发布时间】:2010-10-05 01:07:36
【问题描述】:

我正在尝试从位图图像中的一个区域生成矢量图形,虽然我当前的算法适用于大多数情况,但它存在一些问题并且速度很慢。

所以我想知道你们是否知道任何简单的算法或代码示例可以有效地做到这一点。

我的情况很简单。我有一个位图图像,有几个平坦的统一区域。我希望将这些区域转换为点集,以便稍后将它们重新创建为矢量图形。我永远不会有重叠的形状,形状总是封闭的,而且它们总是一种颜色(所有像素的 RGB 值相同),所以很容易确定轮廓,但要有效地做起来就更难了。

编辑:我按下提交按钮太快了...

理想情况下,我想要一个在 .NET 中工作的解决方案,但伪代码也应该能正常工作。也许你们知道一些关于图像处理的好资源?

再次编辑:所以我所追求的是一个算法或一个库,它将给我一个描述图像中每个区域的点或向量列表,而不是矢量化图像本身。

【问题讨论】:

    标签: .net image-processing


    【解决方案1】:

    由于您的对象是不同的,您可以运行一种算法来标记连通分量。 wikipedia article 刚开始还可以,虽然我不知道他们为什么专注于多遍算法,但一次通过就足够了。当您发现连接的组件时,您必须维护一些数据结构来表示轮廓。如果已知您的对象很简单(例如与轴成法线角度的矩形或圆形),则表示可能非常简单。如果它们是一般形状,那么您将需要一些更复杂的曲线表示。 (请记住棘手的对象,例如“U”或“O”形状。)

    【讨论】:

    • 一篇有趣的文章!我的对象可以有任何形状,但我认为这会有所帮助。谢谢!
    【解决方案2】:

    我在这方面没有经验,所以我可能会描述一个可以使用的最糟糕的算法,希望其他可能会通过这个问题的人会被我的回答激怒,他们会给你一些今天更好的可用算法。

    我会做一个洪水填充算法来找到每个斑点的边缘,并为每个斑点的每个边缘点制作一个带有向量的多边形。这将为您提供具有与 blob 周围的像素一样多的角的多边形。

    然后我会查找多边形简化例程,例如,这些例程将采用一组位于同一条线上的向量并删除所有中间点。

    洪水填充也不是完全必要的 - 只需从当前像素搜索相邻像素(有 8 个相邻像素)并使用右手边跟随来填充多边形点。

    它应该相对较快,尽管多边形会非常复杂,除非你得到一个非常好的简化例程。

    -亚当

    【讨论】:

    • 这或多或少正是我现在所做的。它有效,只是不是 100% 的时间:-)
    • 哦,我有兴趣了解它在哪里/何时不起作用!我爱我一些极端案例... om nom nom nom nom nom ...
    【解决方案3】:

    只是为了取笑并跳出框框思考,我尝试使用运动检测非常成功。我有一张白色的图片,里面有 3 个圆圈。

    使用来自这个网络摄像头运动检测程序 (http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx) 的源代码,我得到了所有 3 个圆圈的区域,并且可以轻松地将它们映射出来。 我只是将图片两次输入到运动检测例程中,其中一张图片向右推了一点。 根据您使用的检测算法,您可以有不同的细节级别(如下面的示例图片所示):

    所有荣誉归运动检测程序的作者:Andrew Kirillov。

    【讨论】:

      【解决方案4】:

      您可能还对this 遗传算法感兴趣。

      【讨论】:

        【解决方案5】:

        This paper 比较了几种流行的技术。我不会说算法简单,但处理是彻底的。

        【讨论】:

          猜你喜欢
          • 2020-01-09
          • 1970-01-01
          • 1970-01-01
          • 2016-08-22
          • 1970-01-01
          • 1970-01-01
          • 2021-02-10
          • 2019-09-17
          • 1970-01-01
          相关资源
          最近更新 更多