这里介绍三种自适应的图像二值化算法:Niblack、Sauvola和Wolf-Jolion。
前言
图像的二值化,主要有全局和自适应的两种算法
- 全局二值化,指整张图片使用同一个阈值,算法的设计在于如何选取阈值
- 自适应的二值化,是一种局部的方法,使用一个滑动窗口在图片上滑动,使用窗口内的值来计算阈值
- 如果图像为多通道的图像,如RGB,则需要先转为灰度图,即只有一个通道
阈值处理
设图片为
对于全局二值化算法而言,
自适应二值化算法
- 对每个像素,在
的窗口内根据算法生成一个值,作为这个像素的阈值。 - 设窗口内像素值的标准差为
,均值为 - 参考资料:https://github.com/openalpr/openalpr/blob/master/src/openalpr/binarize_wolf.cpp
saovola
其中R为图像像素深度的一半,如8bit即256个灰度级别,而R=128
niblack
wolf-jolion
后记
- 算法中的k为超参,取值在0和1之间。
- 这些自适应算法的阈值计算,都着重考虑了均值,然后考虑像素值分布的离散情况
- k越大,像素值的波动(例如标准差、某些量的极值)的影响力越大(使得阈值上升的影响力)。例如Niblack和Sauvola算法,k代表着标准差的影响力
- 不同的自适应算法考虑了不同的衡量因素,根据场景选用不同的算法,如openalpr同时选用sauvola和wolf-jolion
- 代码实现可以使用神经网络卷积中的一些操作,例如PyTorch中的unfold
代码实现
先计算每个像素点的均值、标准差,然后按公式算出结果即可。
以pytorch实现为例:
1 | # reference: https://github.com/openalpr/openalpr/blob/master/src/openalpr/binarize_wolf.cpp |
注释:
- hparams是一个SimpleNamesapce类型
- 边界处理使用镜像复制的方案处理,即replication padding