如果您有图像处理开发的需求可以联系博主,博主的联系方式见文末的名片。
图像阈值化的目的是从灰度图像中分割出目标区域和背景区域,然而仅仅通过设定固定阈值来实现图像的阈值化分割,很难达到理想的分割效果,比如我之前写的博文https://blog.csdn.net/wenhao_ir/article/details/就是一种固定阈值法。
在实际应用中,我们可以通过图像像素邻域块的分布特征来自适应确定区域的二值化阈值。
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 //博主微信/ //有问题可以联系博主交流 //有图像处理需求也可联系博主 //图像处理技术交流 #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; }
运行结果如下图所示:

需要Python代码的可参见博文 https://blog.csdn.net/wenhao_ir/article/details/125592598 的第05点。
延伸阅读:与二值化阈值处理相关的OpenCV函数、方法汇总,便于对比和拿来使用
如果您有图像处理开发的需求可以联系博主,博主的联系方式见下面的名片。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214887.html原文链接:https://javaforall.net
