矢量化图像

时间:2009-02-02 22:17:51

标签: .net image-processing

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

所以我想知道你们是否知道如何有效地完成这项任务的简单算法或代码示例。

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

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

理想情况下,我想在.NET中使用解决方案,但伪代码也应该运行良好。也许你们知道一些关于图像处理的好资源吗?

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

5 个答案:

答案 0 :(得分:4)

由于您的对象不同,您可以运行连接组件标签的算法。 wikipedia article只是一个好的开始,虽然我不知道为什么他们专注于多遍算法,一次通过很容易。当您发现连接的组件时,您将必须维护一些数据结构来表示大纲。如果已知您的对象是简单的(例如,与轴或圆形成垂直角度的矩形),则表示可能非常简单。如果它们是一般形状,那么您将需要一些更复杂的曲线表示。 (记住'U'或'O'形状等棘手的物体。)

答案 1 :(得分:3)

我没有这个领域的经验,所以我可能会描述一个人可以使用的最差算法,并希望其他可能通过这个问题的人会因为我的答案而感到愤怒,他们会给你一些今天更好的可用算法。

我会使用泛光填充算法来查找每个斑点的边缘,并为每个斑点的每个边缘点生成带有矢量的多边形。这将为您提供具有与blob周围的像素一样多的角的多边形。

然后我会查找多边形简化例程,例如,将一堆矢量放在同一行并删除所有中间点。

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

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

- 亚当

答案 2 :(得分:1)

只是为了戏弄一下并在盒子外思考,我尝试使用运动检测非常成功。我有一张白色的照片,里面有3个圆圈。

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

所有信息均归运动检测程序的作者:Andrew Kirillov。

alt text

alt text

答案 3 :(得分:0)

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

答案 4 :(得分:0)

This paper比较了几种流行的技巧。我不会简单地称算法,但治疗是彻底的。