自适应阈值处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自适应阈值处理相关的知识,希望对你有一定的参考价值。

参考技术A   对于色彩均衡的图像,直接使用一个阈值就能完成对图像的阈值化处理。但是,有时图像的色彩是不均衡的,此时如果只使用一个阈值,就无法得到清晰有效的阈值分割结果图像。

  有一种改进的阈值处理技术,其使用变化的阈值完成对图像的阈值处理,这种技术被称为自适应阈值处理。
  在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。
  与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。

  OpenCV提供了函数cv2.adaptiveThreshold()来实现自适应阈值处理,该函数的语法格式为:

式中:

  函数cv2.adaptiveThreshold()根据参数adaptiveMethod来确定自适应阈值的计算方法,函数包含cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C两种不同的方法。这两种方法都是逐个像素地计算自适应阈值,自适应阈值等于每个像素由参数blockSize所指定邻域的加权平均值减去常量C。两种不同的方法在计算邻域的加权平均值时所采用的方式不同:

【例6.11】对一幅图像分别使用二值化阈值函数cv2.threshold()和自适应阈值函数cv2.adaptiveThreshold()进行处理,观察处理结果的差异。

  通过对比普通的阈值处理与自适应阈值处理可以发现,自适应阈值处理保留了更多的细节信息。在一些极端情况下,普通的阈值处理会丢失大量的信息,而自适应阈值处理可以得到效果更好的二值图像。

利用OpenCV的函数adaptiveThreshold()实现图像的自适应阈值分割---详解函数adaptiveThreshold()

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

图像阈值化的目的是从灰度图像中分割出目标区域和背景区域,然而仅仅通过设定固定阈值来实现图像的阈值化分割,很难达到理想的分割效果,比如我之前写的博文https://blog.csdn.net/wenhao_ir/article/details/51179117就是一种固定阈值法。

在实际应用中,我们可以通过图像像素邻域块的分布特征来自适应确定区域的二值化阈值。

OpenCV中提供了自适应阈值化函数adaptiveThreshold来实现自适应阈值处理。

函数adaptiveThreshold()的原型如下:

void cv::adaptiveThreshold	(	InputArray 	src,
								OutputArray 	dst,
								double 	maxValue,
								int 	adaptiveMethod,
								int 	thresholdType,
								int 	blockSize,
								double 	C 
							)	

官方文档对这个函数的说明如下:

 这里我对各参数作一个中文说明。

InputArray src:源图像

OutputArray dst:输出图像,与源图像大小一致

double maxValue:上面的截图已经很直观地说明了这个值的意义。

int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。

ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值

ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值

int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV 。这两个参数的意义如下:

int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定。

double C:在对参数int adaptiveMethod的说明中,我已经说了这个参数的作用,从中可以看出,这个参数实际上是一个偏移值调整量。

从上面的说明中可以看出,使用函数adaptiveThreshold的关键是确定blockSize和C的值,明白了这两个值的意义之后,在实际项目中,我们可以根据试验法选出较为合适的值。

下面是一个实例的源码

源码中用到的图像的下载链接:

链接:https://pan.baidu.com/s/1k13r2DdhEXuXWlxV-IbxNA 提取码:kwgo

//opencv版本:OpenCV3.0
//VS版本:VS2012
//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
int main( )

  // 图像读取及判断
  cv::Mat srcImage = cv::imread("F:/material/images/P0027-coins-01.png");
  if( !srcImage.data ) 
      return 1;
  // 灰度转换
  cv::Mat srcGray;
  cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  cv::imshow("srcGray", srcGray);
  cv::Mat dstImage;
  // 初始化自适应阈值参数
  int blockSize = 5;  
  int constValue = 10;  
  const int maxVal = 255;
    /* 自适应阈值算法
  0:ADAPTIVE_THRESH_MEAN_C
  1: ADAPTIVE_THRESH_GAUSSIAN_C
  阈值类型
  0: THRESH_BINARY
  1: THRESH_BINARY_INV */
  int adaptiveMethod = 0;
  int thresholdType = 1;
  // 图像自适应阈值操作
  cv::adaptiveThreshold(srcGray, dstImage, 
    maxVal, adaptiveMethod, 
    thresholdType, blockSize, 
    constValue);   
  cv::imshow("dstImage", dstImage);
  cv::waitKey(0);
  return 0;

运行结果如下图所示:

​延伸阅读:https://blog.csdn.net/wenhao_ir/article/details/51671023

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

以上是关于自适应阈值处理的主要内容,如果未能解决你的问题,请参考以下文章

youcans 的 OpenCV 例程200篇166.自适应阈值处理

OpenCV计算机视觉 —— 图像的阈值处理与自适应阈值Otsu

[图像处理]14.分割算法比较 OTSU算法+自适应阈值算法+分水岭

opencv中自适应阈值和正常阈值之间的区别

python-opencv 图像二值化,自适应阈值处理

基于Otsu算法的图像自适应阈值分割