请参考this journal article。
第4.1节(预处理)的最后一段说,
将[threshold = (mean + std dev)
]与Otsu阈值结合使用可获得以下结果,
。
而且,没有它们,我将获得以下结果,
。
因此,我有三个问题,
(1)我实施二进制阈值法的主要问题是什么?
(2)如果Otsu Threshold确实给出了很好的结果,为什么本文的作者建议使用[threshold = (mean + std dev)
]?
(3)如何将double
值用作大津的阈值?
源代码
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算法的进一步修改。如果您想自己实现这些,请查看积分图像的概念。