我想向逻辑上的任何人请求帮助,以及制定图像轮廓的更好的示例代码。
为了更清楚,我说的是一个透明的图像。比方说,我有一个中间有多边形的PNG图像,或者更好的岛屿顶视图。现在,我想跟踪轮廓并在其上设置颜色。就像Adobe Photoshop中的效果'笔画'一样。
我已经完成了那么多,我已经创建了一个跟踪轮廓的程序。但问题是,这是线性扫描。从左到右,然后向下,然后再从左到右。我相信你明白了。我希望跟踪流动,就像你手动跟踪它一样。跟你一样跟踪圈子。
目的是将其用作精确悬停多边形的触发区域。而且我的问题是,例如,如果有两个岛。
我希望我的疑问很明确。任何建议,样品都表示赞赏。但如果它是在c#代码形式或伪代码中有一些解释,那就更好了。
提前多多感谢。
- 此外:
另外,我想(我想我已经忘记提及)以顺序方式记录笔画的坐标。所以我可以稍后操纵它们。这就是为什么我想以流动的方式制作概述逻辑。这是我正在寻找的算法。非常感谢!
答案 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
示例:
答案 1 :(得分:1)
考虑使用图像处理技术,如下所示: