图像二值化算法-传统方法

正午 2020-06-10 PM 43℃ 0条

图像二值化在 OCR 里面是比较重要的部分

在我写的标注工具离 地址
实现了下面的算法

Otsu - "A threshold selection method from gray-level histograms", 1979.
Bernsen - "Dynamic thresholding of gray-level images", 1986.
Niblack - "An Introduction to Digital Image Processing", 1986.
Sauvola - "Adaptive document image binarization", 1999.
Wolf - "Extraction and Recognition of Artificial Text in Multimedia Documents", 2003.
NICK - "Comparison of Niblack inspired Binarization methods for ancient documents", 2009.
ISauvola - "ISauvola: Improved Sauvola’s Algorithm for Document Image Binarization", 2016.
WAN - "Binarization of Document Image Using Optimum Threshold Modification", 2018.

图像二值化 传统方法(非深度学习)中主要分两类,一类是全局阈值,一类是局部阈值,全局阈值的方法可以形式化如下

截屏2020-06-10 下午1.14.29.png

其中 (x, y) 是图像上的坐标, f(x, y) 描述这个图像为一个函数。 我们需要得到另一个函数 g(x,y) 他的值域只有两个值

最简单的方法就是用一个固定阈值,比如 127 大于 127 的为白色(255),小于127 的为黑色(0)。 但是这样简单的划分太粗,效果自然不好。最常用的全局算法 OTSU 就想了个策略来确定阈值是多少的时候是最优的。

OTSU 不考虑像素之间的位置关系,它只考虑统计信息。 把图像的像素值看做在 (0,255)之间取值的离散随机变量,我们最终会把这个分布分为两类,黑色和白色, 使得类间方差最大的就是全局最好的阈值。算法的实现也相对简单,在图像的分布直方图只有一个波峰的时候还是很不错的效果,一旦有多个波峰,效果就会很长。比如下面的例子
原图

OTSU 的结果

OTSU结果

为了克服这种缺陷,最直接的就是局部阈值,每个位置选择一个大小为 w 的窗口,根据窗口内的像素计算求处当前位置的阈值
窗口如何选择,以及阈值如何计算成了比较关键的问题。通常窗口为成为超参数,

重点解释下 Sauvola(Adaptive document image binarization 1999) 算法。

在每一点,根据下面的公式计算阈值,其中 window_mean 是窗口内的均值, window_stdev 是窗口内的标准差, k 是超参数

 threshold = window_mean * (1 +k *((window_stdev / 128)-1));

还是上面那个图,算法结果如下:

sauvola.png

这里用到的还是均值和方差标准差, 有的算法会在这个阈值的计算上增加一些其他的统计信息比如 组大最小值这种,但要得到好的鲁棒性仍然是很困难的。

标签: none

非特殊说明,本博所有文章均为博主原创。

评论