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

标签 c# c++ math graphics

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

为了更清楚地说明,我说的是透明图像。比如说,我有一个中间有多边形形状的 PNG 图像,或者更好的是一个岛屿的顶 View 。现在,我想描出轮廓并为其设置颜色。就像 Adob​​e 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

示例:

edge detection

关于c# - 以编程方式制定图像轮廓(最好是 C#/C++ 编码,或伪编码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507112/

相关文章:

c# - WCF 异常 : InvalidOperationException was unhandled

c# - 为什么允许除了一个可选参数之外还有两个相同的方法签名?

c# - 提取以 x 开头以 y 结尾的字符串

java - 在java中的客户端服务器套接字中将字符串转换为int

math - 计算位于 3D 平面上的向量

C# ErrorProvider CapsLock 按下

c++ - 确定 C/C++ 结构中元素对齐的算法

c++ - 模板函数和类在不同文件中的使用

c++ - 将/MD 库与/MDd 应用程序一起使用

algorithm - 编写一个 36 位随机数生成器