以编程方式制定图像轮廓(最好是C#/ C ++编码,或伪编码)

时间:2011-03-31 22:26:08

标签: c# c++ math graphics

我想向逻辑上的任何人请求帮助,以及制定图像轮廓的更好的示例代码。

为了更清楚,我说的是一个透明的图像。比方说,我有一个中间有多边形的PNG图像,或者更好的岛屿顶视图。现在,我想跟踪轮廓并在其上设置颜色。就像Adobe Photoshop中的效果'笔画'一样。

我已经完成了那么多,我已经创建了一个跟踪轮廓的程序。但问题是,这是线性扫描。从左到右,然后向下,然后再从左到右。我相信你明白了。我希望跟踪流动,就像你手动跟踪它一样。跟你一样跟踪圈子。

目的是将其用作精确悬停多边形的触发区域。而且我的问题是,例如,如果有两个岛。

我希望我的疑问很明确。任何建议,样品都表示赞赏。但如果它是在c#代码形式或伪代码中有一些解释,那就更好了。

提前多多感谢。

- 此外:

另外,我想(我想我已经忘记提及)以顺序方式记录笔画的坐标。所以我可以稍后操纵它们。这就是为什么我想以流动的方式制作概述逻辑。这是我正在寻找的算法。非常感谢!

2 个答案:

答案 0 :(得分:5)

一种方法是使用通用边缘检测算法。例如,Sobel edge detection。但是,它没有针对干净,抗锯齿,双色图像进行优化,如下例所示,因此产生了一些粗略的结果。为了更好地保留抗锯齿,并获得平滑的结果,我建议使用以下算法:

Image blurredImg = gaussianBlur(sourceImg, blurRadius = desiredOutlineWidth);
const float sharpnessCoef = 0.1; // value may need tuning or may need to
                                 // depend on the blur radius
Image dilatedImg = from blurredImg, map all pixels with
                   brightness > sharpnessCoef to white and
                   multiply the rest by 1 / sharpnessCoef
Image smoothResult = subtract sourceImg from dilatedImg

示例:

edge detection

答案 1 :(得分:1)

考虑使用图像处理技术,如下所示:

http://www.codeproject.com/KB/cs/Canny_Edge_Detection.aspx