adaptiveThreshold()函数的作用是对矩阵采用自适应阈值操作,函数原型:
double adapTivaThreshold(InputArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C)
- 第一个参数:InputArray类型的src,输入数组,必须为单通道,8位或32位的浮点型Mat即可。
- 第二个参数:OutputArray类型的dst,与输入有一样的尺寸和类型。
- 第三个参数:double类型的maxval,给像素赋的满足条件的非0值。
- 第四个参数:int类型的adaptiveMethod,指定要使用的自适应阈值算法,可取值为ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C
- 第五个参数:int类型的thresholdType,阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV。
- 第六个参数:int类型的blocksize,用于计算阈值大小的一个像素的邻域尺寸,取3,5,7等。
- 第七个参数:double类型的C,减去平均或加权平均值后的常数值,通常为正数。
adaptiveThreshold()函数根据如下公式,将一幅灰度图变为二值图,当第五个参数thresholdTypr为THRESH_BINARY时,公式为:
当第五个参数thresholdTypr为THRESH_BINARY_INV时,公式为:
其中T(x, y)为分别计算每个像素的单独阈值,取值如下:
- 对于ADAPTIVE_THRESH_MEAN_C方法,T(x, y)为bloskSize*blockSize邻域内(x, y)减去第七个参数C的平均值。
- 对于ADAPTIVE_THRESH_GAUSSIAN_C方法,T(x, y)为bloskSize*blockSize邻域内(x, y)减去第七个参数C与高斯窗交叉相关的加权总和。
代码示例:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main() {
Mat srcImage, grayImage;
srcImage = imread("/Users/dwz/Desktop/cpp/1.jpg");
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
Mat dstImage;
adaptiveThreshold(grayImage, dstImage, 255, 1, 0, 5,0);
imwrite("threshold.jpg", dstImage);
return 0;
}
输入:
输出: