php gd 二值化,图像二值化算法-传统方法

图像二值化在 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.

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

2273c440d2219ee3bf541780cb9965ff.png

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

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

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

c082373fefb63f94b0ab95c8be32cc53.png

OTSU 的结果

fa68a342dc829d966612bc97d26d7281.png

为了克服这种缺陷,最直接的就是局部阈值,每个位置选择一个大小为 w 的窗口,根据窗口内的像素计算求处当前位置的阈值

窗口如何选择,以及阈值如何计算成了比较关键的问题。通常窗口为成为超参数,

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

在每一点,根据下面的公式计算阈值,其中 window_mean 是窗口内的均值, window_stdev 是窗口内的标准差, k 是超参数threshold = window_mean * (1 +k *((window_stdev / 128)-1));

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

3bd0349dafe730b657828e69d612972a.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值