【问题标题】:Image processing - Reduce object thickness without removing图像处理 - 减少物体厚度而不去除
【发布时间】:2012-02-23 04:23:36
【问题描述】:

我有一张像下面这样的图片。

我想要的是单色图像,白色部分保持白色,其余部分为黑色。然而,棘手的部分是我还想将白色部分的厚度减少到一个像素。

这是我坚持的第二部分。
我的第一个想法是做一个简单的阈值,然后使用一种“生命游戏”类型的迭代过程,如果白色像素在一侧有邻居但另一侧没有(即它是边缘),则将其移除但是我有一个感觉这会随着时间的推移将行尾减少到零,所以我最终会得到一个空白图像。

在给定原始图像的情况下,我可以使用什么算法来获得我想要的图像?

(我选择的语言是 C#,但什么都可以)


原图:

【问题讨论】:

  • 也许你可以添加一个限制:如果一个白色像素有

标签: c# algorithm language-agnostic image-processing


【解决方案1】:

我建议您研究二元形态学变换,例如侵蚀和膨胀。图形库如 OpenCV() http://opencv.willowgarage.com/wiki/ 和统计/矩阵工具 Gnu Octave http://octave.sourceforge.net/image/function/bwmorph.html 支持这些操作。

【讨论】:

    【解决方案2】:

    检测给定高度的形态扩展最大值后:

    然后细化给出:

    您还可以操纵高度参数,或修剪变薄的图像。

    Mathematica 中的代码:

    img = ColorConvert[Import["http://i.stack.imgur.com/zPtl6.png"],  "Grayscale"];
    max = MaxDetect[img, .55]
    Thinning[max]
    

    编辑我遵循了自己的建议,0.4 的高度给出了更精确本地化的片段:

    【讨论】:

    • 这看起来几乎正是我想要的。我没有 Mathematica(也不想为此买它)。它使用什么算法?
    • 由于某种原因,我无法编辑我之前的评论。有关扩展最大值的描述:P. Soille,“形态图像分析”。对于细化,现在我不知道到底使用了什么算法;这是一个迭代过程,它查看每个白色像素周围的 3x3 邻域并决定是否将其变黑 - 即,您提到的“生命游戏”的一个版本。这里有细化的说明:homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm
    • 对于细化,两种常见的算法是 Stentiford 和 Zhang-Suen。应用程序 WinTopo 的免费版本具有每个应用程序的实现;该应用程序包括用于光栅到矢量转换的有用平滑选项。对于阈值,您还可以考虑局部阈值,例如“移动平均线”等;一些线状特征可能肉眼可见,但会被全局阈值消除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多