在进行图像二值化时总是存在一些明部、暗部的干扰,单一的使用opencv提供的原始二值化方法很难做到预期效果。一般我们都会采用分块二值化(将图像切为多个局部进行二值化)、对比度提升(对值域进行线性或者非线性变换、直方图均衡化)、局部二值化(Bernsen 算法、 Niblack 算法、Sauvola算法、 Chow 和 Kaneko 算法等)的方式进行二值化。这些手段限制了思路的发挥,不一定适用于所有场景。这里对可搜集的二值化方法进行汇总。共统计出4种二值化方法:1、颜色空间转换,2、多次二值化,3、背景光补偿,4、梯度信息补充。本博文介绍了各个方法的案例、核心思想、基本步骤和适用范围。
1、颜色空间转化
rgb影像转灰度图后,在进行二值化时会遗失部分颜色信息,而在某些任务中颜色信息又是进行二值化的必须依赖。如,按照颜色提取图中的特定物体等。
具体案例:https://bbs.csdn.net/topics/390735437?page=1
原始思路:rgb=>gray=>otsu二值化
新思路:rgb=>hsv=>h通道otsu二值化
此外,对于hsv颜色空间,还可以对h*v进行二值化,这样子可以提取出图像中颜色显著的部分。
核心思想:通过转换颜色空间,对明度、亮度、颜色饱和度等信息进行二值化。
基本步骤:
1、进行颜色空间转换,使颜色突出的部分区域在指定通道(明度、亮度、颜色饱和度)上比较突出;(如hsv的h和v通道,lab的l通道)
2、对指定通道进行二值化
适用范围:以颜色显著变换为主的形态分割
2、多次二值化
对于一些存在亮部和暗部的图像,使用一个二值化阈值进行操作是无法得到理想结果的,需要使用多个阈值进行二值化。
具体案例:https://blog.csdn.net/weixin_55984718/article/details/125769347
执行效果:
核心思想:进行2次OTSU分别提取出亮部和暗部的二值化阈值,然后根据2个阈值进行逐像素的二值化。
基本步骤:
1、基于OTSU得到二值化阈值t1和mask ;
2、获取mask中暗部的二值化阈值t2 ;
3、针对亮部和暗部区域分别使用不同的阈值 ;(足像素进行二值化)
适用范围:存在一个阴影或者亮部干扰的图像
3、背景光补偿法
在对书籍文本进行二值化化时,通常由于反光、数据表面不平使原始图像上存在亮斑和暗斑,这使得单一二值化阈值不再适用。
具体案例:https://blog.csdn.net/u013162930/article/details/47755363
执行效果:原图和求出的背景光补偿图
核心思想:通过邻域确定背景光补偿值,最终使图像的光照处于一个统一稳定的的水平,然后再进行二值化
基本步骤:
1、逐像素计算其邻域的最大值,作为背景值,然后计算出背景光补偿值
2、根据背景光补偿图对原图光照进行补偿,使图像的光照处于一个统一稳定的的水平
3、对图像进行otsu二值化
像数值和领域锚值差异小,补偿值接近0;原图过亮,补偿值为负数;原图过暗,补偿值为正数
适用范围:其计算背景光的方式使其仅能用于文本的二值化,若能从全局角度计算出背景光补偿值,则可以用于其他复杂场景
注1:还有另外一种背景光补偿法,其基于全局均值(锚值)和局部均值(当前值)做差得到补偿值 可以参考 https://harry.blog.csdn.net/article/details/54019994
注2:该方法作者提到了sauvola二值算法,其实现在https://blog.csdn.net/lcalqf/article/details/71479650
sauvola二值算法的使用效果可以参考,比起章节二中的多次二值化是要好一些
http://www.zhihuishi.com/source/248.html#download
4、梯度信息补充
在某些光照环境下,亮与暗为一个基于对比的相对关系,某些像数值在亮部区域算暗,而在暗部区域算亮。
例如上图,若适用单一阈值进行处理则会得到以下结果:
具体案例:https://blog.woyou.cool/post/%e4%b8%8d%e5%9d%87%e5%8c%80%e5%85%89%e7%85%a7%e4%b8%8b%e7%9a%84%e5%9b%be%e5%83%8f%e4%ba%8c%e5%80%bc%e5%8c%96%e5%a4%84%e7%90%86%e6%96%b9%e6%a1%88/
核心思想:通过边缘梯度信息对二值化结果再次进行分割判断
基本步骤:
1、先求出原图的边缘梯度信息(包含xy方向)
2、对原图进行二值化
3、使用边缘梯度信息分割二值图
4、根据均值选择连通域
适用范围:其基于梯度信息对二值化结果进行优化,只能用于提取面积较大的图形(对于字符的提取是不行的)