【问题标题】:Why is image binarization showing poorer results?为什么图像二值化显示较差的结果?
【发布时间】:2017-02-20 15:13:41
【问题描述】:

请参考this journal article

第 4.1 节(预处理)的最后一段说,

将 [threshold = (mean + std dev)] 与 Otsu Thresholding 一起使用会得到以下结果,

.

而且,没有它们,我得到以下结果,

.

因此,我有三个问题,

(1) 我实现二进制阈值的主要问题是什么?

(2) 如果Otsu Threshold真的给出了很好的结果,为什么文章作者建议使用[threshold = (mean + std dev)]?

(3) 如何应用double 值作为 Otsu 的阈值?


源代码

Here is the GitHub repository.

源码中最相关的部分如下,

    private void thresholdButton_Click(object sender, EventArgs e)
    {
        Bitmap color = (Bitmap)this.inputImagePictureBox.Image;

        Bitmap temp = Grayscale.ToGrayscale((Bitmap)color.Clone());

        ImageStatistics imgStat = new ImageStatistics(temp);

        Histogram histogram = imgStat.Gray;

        double meanPlusStdDev = histogram.Mean + histogram.StdDev;

        OtsuThreshold otsu = new OtsuThreshold();

        int thres = otsu.getOtsuThreshold(temp);//////

        //otsu.Apply(temp, (int)meanPlusStdDev);

        otsu.Apply(temp, thres);

        thresholdedImagePictureBox.Image = temp;
    }

【问题讨论】:

标签: c#-4.0 image-processing filtering histogram threshold


【解决方案1】:

我只会回答 (2)。我还没有看到有人在全球范围内使用 mean + stdev,但是在应用局部自适应阈值技术时这很常见。因此,不是为整个图像计算一个阈值,而是根据它的邻域为每个像素计算一个阈值。在文章中描述的应用程序中会更有意义。具有局部均值(x,y)和局部标准差(x,y)的像素(x,y)的Niblack自适应阈值是:

均值(x,y) + k * stdev(x,y)

其中 k 是一个可调参数。它在文档二值化中非常常用。另一个常见的是

t * mean(x,y) + k * stdev(x,y)

您可以在其中调整局部均值和局部标准差阈值。 stdev 项的重点是赋予边缘权重。划痕始终是局部标准偏差较高的区域,因此使用与其相关的术语应该比简单的平均阈值更有效。

如果这些看起来很有趣,您还可以查看 Sauvola 算法,这是对 Niblack 算法的进一步修改。如果您想自己实现这些,请查看积分图像的概念。

【讨论】:

    【解决方案2】:

    1) 没有“问题”。您使用不同的阈值进行阈值化,然后得到不同的结果。

    2) 没有找到全局阈值的通用方法,全局阈值可能是一个非常糟糕的解决方案。 mean/stdev 方法的一个微小优势是它留下了一个可调整的参数(在 stdev 前面的系数),这给实现者一种(错误的)控制感。

    3) 我无法理解这个问题。阈值是整数,因为像素值是整数。

    【讨论】:

    • 你对tapio的回答有什么看法?
    • @anonymous:没什么特别的。
    猜你喜欢
    • 2016-03-02
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多