c#-4.0 - 为什么图像二值化显示的效果较差?-LMLPHP

请参考this journal article

第4.1节(预处理)的最后一段说,
c#-4.0 - 为什么图像二值化显示的效果较差?-LMLPHP

将[threshold = (mean + std dev)]与Otsu阈值结合使用可获得以下结果,

c#-4.0 - 为什么图像二值化显示的效果较差?-LMLPHP



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

c#-4.0 - 为什么图像二值化显示的效果较差?-LMLPHP



因此,我有三个问题,

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

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

(3)如何将double值用作大津的阈值?



c#-4.0 - 为什么图像二值化显示的效果较差?-LMLPHP

源代码

c#-4.0 - 为什么图像二值化显示的效果较差?-LMLPHP

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;
    }

最佳答案

我只会回答(2)。我还没有看到任何人在全局范围内使用mean + stdev,但是在应用局部自适应阈值技术时,这种情况非常普遍。因此,您不必为整个图像计算一个阈值,而是根据其邻域为每个像素计算一个阈值。在本文描述的应用程序中,这将更有意义。具有局部均值(x,y)和局部stdev(x,y)的像素(x,y)的Niblack自适应阈值是:

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

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

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

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

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

10-08 17:40