3

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

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

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

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

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

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

4

5 回答 5

4

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

于 2009-02-02T22:29:21.590 回答
3

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

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

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

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

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

-亚当

于 2009-02-02T22:37:01.450 回答
1

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

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

所有的信任都归运动检测程序的作者:安德鲁基里洛夫。

替代文字

替代文字

于 2009-02-02T23:07:29.983 回答
0

您可能也对这种遗传算法感兴趣。

于 2009-02-04T00:47:32.120 回答
0

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

于 2011-10-07T06:38:08.250 回答