图像阈值化的一个常见作用是从灰度图像中分割出目标区域和背景区域,然而仅仅通过设定固定阈值来实现图像的阈值化分割,就显得缺乏灵活性,有时候难以达到理想的分割效果。
比如我之前写的博文 https://www.hhai.cc/thread-162-1-1.html 中介绍的函数threshold(),它实现的就是固定阈值法。
在实际应用中,我们可以通过图像像素邻域块的分布特征来自适应确定区域的二值化阈值,实际上就是把图像分成一小块、一小块的,然后去用某种算法去计算这些小块的二值化阈值,并对这些小块进行阈值化处理。
OpenCV中提供了自适应阈值化函数adaptiveThreshold来实现自适应阈值处理。
函数adaptiveThreshold()的原型如下:
void cv::adaptiveThreshold(InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C)
官方文档对这个函数的说明如下:
对上面的内容作一个大概的翻译如下:
InputArray src:源图像。
OutputArray dst:输出图像,与源图像的尺寸和数据类型一致。
maxValue:上面截图中的数学表达式已经很直观地说明了这个值的意义,这里就不再赘述了。
adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
thresholdType:这是阈值化类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV ,这两个取值的意义见上面截图中的公式。
blockSize:函数adaptiveThreshold()的阈值计算单位是像素的邻域块,而邻域块取多大,就由这个值作决定。
C:在对参数adaptiveMethod的说明中,已经说明了这个参数的作用,从中可以看出,这个参数实际上是一个偏移值调整量。
下面附一个使用函数adaptiveThreshold()对图像进行自适应二值化阈值分割的C++代码。
具体的代码请大家查看本博文的原文获取,
本博文原文链接:
https://www.hhai.cc/thread-166-1-1.html
示例代码运行结果如下: