自适应阈值(adaptiveThreshold)分割原理及实现

您所在的位置:网站首页 阈值计算方法 自适应阈值(adaptiveThreshold)分割原理及实现

自适应阈值(adaptiveThreshold)分割原理及实现

2023-11-06 10:57| 来源: 网络整理| 查看: 265

背景介绍及原理

前面介绍了OTSU算法和最大熵算法,但这两种算法都属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:

                  

显然,这样的阈值处理结果不是我们想要的,那么就需要一种方法来应对这样的情况。

这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)

如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值。值得说明的是:如果用局部的均值作为局部的阈值,就是常说的移动平均法(听起来挺高大上,其实......逃)。

 

OpenCV提供的API:

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

说明下各参数:

InputArray src:源图像

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

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的计算单位是像素的邻域块,这是局部邻域大小,3、5、7等。

double C:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。

注:相比OpenCV的API,我多用了一个中值法确定阈值。

  基于OpenCV实现 #include #include #include #include enum adaptiveMethod{meanFilter,gaaussianFilter,medianFilter}; void AdaptiveThreshold(cv::Mat& src, cv::Mat& dst, double Maxval, int Subsize, double c, adaptiveMethod method = meanFilter){ if (src.channels() > 1) cv::cvtColor(src, src, CV_RGB2GRAY); cv::Mat smooth; switch (method) { case meanFilter: cv::blur(src, smooth, cv::Size(Subsize, Subsize)); //均值滤波 break; case gaaussianFilter: cv::GaussianBlur(src, smooth, cv::Size(Subsize, Subsize),0,0); //高斯滤波 break; case medianFilter: cv::medianBlur(src, smooth, Subsize); //中值滤波 break; default: break; } smooth = smooth - c; //阈值处理 src.copyTo(dst); for (int r = 0; r < src.rows;++r){ const uchar* srcptr = src.ptr(r); const uchar* smoothptr = smooth.ptr(r); uchar* dstptr = dst.ptr(r); for (int c = 0; c < src.cols; ++c){ if (srcptr[c]>smoothptr[c]){ dstptr[c] = Maxval; } else dstptr[c] = 0; } } } int main(){ cv::Mat src = cv::imread("I:\\Learning-and-Practice\\2019Change\\Image process algorithm\\Img\\Fig1049(a)(spot_shaded_text_image).tif"); if (src.empty()){ return -1; } if (src.channels() > 1) cv::cvtColor(src, src, CV_RGB2GRAY); cv::Mat dst, dst2; double t2 = (double)cv::getTickCount(); AdaptiveThreshold(src, dst, 255, 21, 10, meanFilter); // t2 = (double)cv::getTickCount() - t2; double time2 = (t2 *1000.) / ((double)cv::getTickFrequency()); std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3