opencv-adaptiveThreshold自适应阈值
OTSU算法和最大熵算法,但这两种算法都属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:
此时应采用自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)
如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值
#include<opencv2/opencv.hpp> #include<iostream> int main(int argc, char** argv) { cv::Mat srcImage = cv::imread("D:/bb/tu/6.png"); cv::Mat srcGray; cv::cvtColor(srcImage, srcGray, cv::COLOR_RGB2GRAY); cv::imshow("srcGray", srcGray); cv::Mat dstImage; const int maxVal = 255; int adaptiveMethod = 0; int thresholdType = 1; int blockSize = 5; int constValue = 10; cv::adaptiveThreshold(srcGray, dstImage,maxVal, adaptiveMethod,thresholdType, blockSize,constValue);// 自适应阈值操作 /* 参数1:InputArray src:源图像 参数2:OutputArray dst:输出图像,与源图像大小一致 参数3:maxVal 预设最大值 参数4:adaptiveMethod 在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C cv::ADAPTIVE_THRESH_MEAN_C=0 的计算方法是计算出领域的平均值再减去第七个参数double C的值 cv::ADAPTIVE_THRESH_GAUSSIAN_C=1 的计算方法是计算出领域的高斯均值再减去第七个参数double C的值 参数5:thresholdType 这是阈值类型,只有两个取值,分别为 cv::THRESH_BINARY=0 和 cv::THRESH_BINARY_INV=1 参数6:blockSize 表示邻域大小,局部邻域大小为3、5、7等 参数7:constValue 这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再加这个值就是最终阈值 */ cv::imshow("dstImage", dstImage); cv::waitKey(0); return 0; }