我只是想向任何人寻求逻辑方面的帮助,以及制定图像轮廓的更好的示例代码。
为了更清楚地说明,我说的是透明图像。比如说,我有一个中间有多边形形状的 PNG 图像,或者更好的是一个岛屿的顶 View 。现在,我想描出轮廓并为其设置颜色。就像 Adobe Photoshop 中的“描边”效果一样。
到目前为止,我已经完成了,我已经创建了一个可以跟踪轮廓的程序。但我的问题是,它是线性扫描。从左到右,然后向下,然后再从左到右。我相信你明白了。我希望追踪是流畅的,就像你手动追踪一样。就像你画一个圆圈一样。
目的是用作精确悬停多边形的触发区域。我的问题是,例如是否有两个岛。
我希望我的问题很清楚。任何建议、 sample 表示赞赏。但如果它是 C# 代码形式或带有一些解释的伪代码,那就更好了。
提前非常感谢。
-- 添加:
另外,我想(我想我忘了提及)以顺序方式记录笔画的坐标。这样我以后就可以操纵它们。这就是为什么我想以流程的方式制作大纲逻辑。这就是我正在专门寻找的算法。非常感谢!
最佳答案
一种方法是使用通用边缘检测算法。例如,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
示例:
关于c# - 以编程方式制定图像轮廓(最好是 C#/C++ 编码,或伪编码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507112/