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

Posted 昊虹图像算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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

以上是关于利用OpenCV的函数adaptiveThreshold()实现图像的自适应阈值分割---详解函数adaptiveThreshold()的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV2学习笔记(十五):利用Cmake高速查找OpenCV函数源代码

利用OpenCV的函数split()和merge()实现通道的分离与合并

利用OpenCV的仿射变换函数warpAffine()实现图像的亚像素级平移

利用OpenCV的仿射变换函数warpAffine()实现图像的亚像素级平移

利用OpenCV的函数LUT()对矩阵的数据进行查表映射

详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示