查看原文
其他

图像二值化-局部阈值方法汇总

OpenCV学堂 2019-03-29

概述:

在图像处理中二值图像处理与分析是图像处理的重要分支,图像二值分割尤为重要,有时候基于全局阈值自动分割的方法并不能准确的将背景和对象二值化,这个时候就需要使用局部的二值化方法。常见的图像二值化局部自动阈值的方法有九种,在ImageJ的分支Fiji中已经全部实现,OpenCV中自适应阈值方法也实现了局部阈值的均值法与高斯均值法算法。对于二值图像常见的表示还可以1 - 表示对象,0-表示背景。



运行与各种方法介绍:

首先看一下ImageJ种九种二值化方法的运行演示:

原图


对应基于各种局部二值化方法运行结果:


Bernsen

实现了Bernsen算法,ImageJ中的代码实现是基于圆形的掩膜而不是标准算法中的矩形掩膜。最初输入的对比度阈值(Contrast Threshold)为T=15,第二个参数在ImageJ的代码实现中没有用到。对矩形或者圆形窗口内的所有像素值根据最大值与最小值得到局部对比度Local Contrast = (Max - Min)跟给定输入参数Contrast Threshold做如下比较:

这样就实现了每个像素点的二值化赋值,从而得到最终的二值图像。


Contrast

基于对比度二值化方法,根据局部像素块最大值与最小值决定中心像素是否设为对象像素或者背景像素。


Mean

均值法,选择的阈值是局部像素的灰度均值(gray mean),该方法的一个变种是用常量C减去均值Mean,然后根据均值实现如下操作:


其中默认情况下参数C取值为0。均值法在OpenCV中的局部阈值方法中有两种实现,一种是普通均值,另外一种是基于高斯的权重均值方法。


Median

中间值法,选择的阈值是局部范围内像素的灰度中值,同样该方法也可以使用常量C来进行阈值调节。实现的操作如下:


MidGrey

中值法,选择的是局部范围内像素的最大与最小值之和的一半作为阈值。同样可以通过常量C来调节阈值大小
 NiBlack

计算局部范围内像素的均值与方差之后,根据如下公式计算阈值


其中K的默认取值为0.2,如果取-0.2将会得到比较暗的二值图像

 

Otsu

该方法前面有一篇文章已经专门见过,感兴趣读者可以自己搜索【OpenCV学堂】相关文章即可得到!这里不再重复。OpenCV中也有基于Otsu的全局阈值实现。看这里即可《二值化算法OTSU源码解析

 

Phansalkar

该方法对低对比度的图像实现二值化比较管用,计算阈值的公式如下:

其中mean表示局部均值,stdev表示方差。其它几个参数的默认取值如下:

k= 0.25, 

r = 0.5, 

p = 2,

q = 10.

 

Sauvola

该方法是NiBlack方法的一个变种,此方法中计算阈值的公式如下:


其中参数k的默认取值为0.5

 

相关源代码可以从下面的链接中获取

https://github.com/fiji/Auto_Threshold


关注【OpenCV学堂】

长按或者扫码下面二维码即可关注

+OpenCV学习群 376281510

进群暗号:OpenCV

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存