函数原型
void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C );
参数说明
- InputArray类型的src,输入图像。
- OutputArray类型的dst,输出图像。
- double类型的maxval,阈值最大值。
- int类型的adaptiveMethod,自适应阈值算法类型。0为ADAPTIVE_THRESH_MEAN_C(均值法获取阈值),1为ADAPTIVE_THRESH_GAUSSIAN_C(高斯窗加权和获取阈值)。
- int类型的thresholdType,阈值操作的类型,0为THRESH_BINARY(标准的二值化阈值法,大于thresh的设为maxval,小于的设为0),1为THRESH_BINARY_INV(反向二值化),2为THRESH_TRUNC(截断阈值法,大于thresh的设为thresh,小于则不变),3为THRESH_TOZERO(零化阈值法,大于thresh的不变,小于则零化),4为THRESH_TOZERO_INV(反向零化),7为THRESH_MASK(没测试出来什么用法,都是黑屏),8为THRESH_OTSU(大津算法,适合双峰直方图的图像,通过分析最大的背景前景类间方差,自动调节阈值),16为THRESH_TRIANGLE(三角法,适合单峰直方图图像,建立谷底和峰顶直线,距离直线垂直距离最大的直方图位置,即阈值thresh)。
- int类型的blockSize,窗口的大小,只能为奇数。
- double类型的C,自适应阈值算法得到平均值或加权平均值后,再减的常数值。
测试代码
#include <iostream> #include "opencv2/core.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" using namespace cv; using namespace std; int main() { cv::Mat src = imread("test.jpg",0); cv::Mat th1,th2; // 自适应阈值函数 adaptiveThreshold(src, th1, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 7, 5); adaptiveThreshold(src, th2,255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 7, 5); imshow("original", src); imshow("mean", th1); imshow("gaussian", th2); waitKey(0); return 0; }
测试效果
图1 灰度图
图2 均值窗
图3 高斯窗
该自适应阈值函数可以用来获取图像边缘特征,用mean或者gaussian都可以;设置常数C时,若其为正数,相当于窗口内求完平均值再减去C的值为阈值,这样对那些颜色类似的区域而言,假设C为5,平均值为120,中心值为119,那么阈值为115,中心值大于阈值,即该点显示为白色;反之,若C为负数,则上图中背景区域基本就是黑色了~
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!