Sauvola算法公式推导

   近日微博上有一位网友针对Sauvola 实现图像二值化一文问我有没有看懂Sauvola算法。

   实话实说,我确实是不懂Sauvola算法的原理,在此之前,我也从来有没有尝试过想去看懂它。看到这位网友的评论后,我找到并学习了一些关于Sauvola算法的资料,目前仍然没有完全理解Sauvola算法的精髓,但我找到了Sauvola 实现图像二值化一文中所发布的源代码公式的来源,并验证了该源代码与Sauvola算法的原理公式基本相符,在此分享我的学习心得与公式推导过程,欢迎讨论。

   1.我眼中的Sauvola算法原理

   参考文献1:《Efficient multiscale Sauvola’s binarization》 密码: diu8,该文献先给出Sauvola算法的计算公式,然后提出了该算法的几点局限性并分别给出了改善对策;

   参考文献2:《Adaptive document image binarization》密码: fhaj,该文献的作者是J. Sauvola,它分别讲述了图像中非文字部分与文字部分的二值化方法,文字部分的二值化方法即Sauvola 实现图像二值化中代码所实现的Sauvola算法。该文献中提到Sauvola算法是Niblack算法的改进版本,有两个公式来源于Niblack算法。《An Introduction to Image Processing》(作者:W. Niblack,1986年出版)一书中有详细讲述Niblack算法,可惜我遍寻网络,也没有找到该书的电子版,全国图书馆咨询联盟,谷歌图书以及多个外文书库都仅仅是收录了书名,并无内容的电子版。

   参考文献3:《基于改进 Otsu和 Niblack的图像二值化方法》密码: mfw4,还好我在文献3中找到了Sauvola算法中沿用的Niblack算法的公式。

   我们常见的图像二值化算法大致可分为全局阈值方法与局部阈值方法这两种类型。其中OTSU算法是全局阈值的代表,而Sauvola算法则是局部阈值方法的标杆。Sauvola算法的输入是灰度图像,它以当前像素点为中心,根据当前像素点邻域内的灰度均值与标准方差来动态计算该像素点的阈值。

   假定当前像素点的坐标为(x,y),以该点为中心的领域为r*r,g(x,y)表示(x,y)处的灰度值,Sauvola算法的步骤为:

   2.Sauvola算法C#代码讲解

   本文中Sauvola算法的代码更新了部分注释,给出阈值计算公式的推导过程:


  本文贴出的代码在图像尺寸比较大时,图像积分的计算值会超出图像积分存储量的数据类型。若您需要用本文发布的代码,还请检查图像尺寸是否会令代码中相关变量溢出,若有请自行修改为合适的变量,谢谢!


Comments

  1. 回复

  2. 回复

  3. 回复

    • 回复

  4. By 路过的jay

    回复

    • By livezingy

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub