OpenCV-C++ 图像自适应阈值二值化处理adaptiveThreshold
API介绍
这篇文章主要介绍有关adaptiveThreshold
的使用方式;
首先,来看一下调用格式;
void adaptiveThreshold( InputArray src, OutputArray dst,
double maxValue, int adaptiveMethod,
int thresholdType, int blockSize, double C );
src
表示需要进行二值化的图像;需要注意的是,该输入必须是8-bit单通道的图像;dst
表示输出图像的二值图像;maxValue
是一个非零值,用于对哪些满足条件的阈值进行赋值;adaptiveMethod
表示选择哪一种自适应阈值算法;Opencv提供两种,ADAPTIVE_THRESH_MEAN_C
与ADAPTIVE_THRESH_GAUSSIAN_C
,下面会详细介绍;thresholdType
表示二值化类型,OpenCV提供两种,THRESH_BINARY
与THRESH_BINARY_INV
,下面会详细介绍;blocksize
表示参与计算的像素的领域范围,必须使用奇数;C
可以为正数, 零或者负数;用于在计算过程中容忍程度;
thresholdType介绍
OpenCV在adaptiveThreshold
方法中允许使用两种ThresholdTypes
,毕竟是进行二值化处理;分别为:
THRESH_BINARY
THRESH_BINARY_INV
计算方式如下:
其中,\(src(x, y)\)表示原始灰度图像灰度值,\(T(x, y)\)是根据自适应阈值算法计算得到;计算的方式来自于adaptiveMethod
;
adaptiveMethod介绍
OpenCV提供两种自适应阈值算法:
ADAPTIVE_THRESH_MEAN_C
ADAPTIVE_THRESH_GAUSSIAN_C
其中,第一种ADAPTIVE_THRESH_MEAN_C
,针对像素\((x, y)\)的计算方式如下:
- \(T(x, y)\)结果是在\((x, y)\)的邻域\(blockSize \times blockSize\)范围内所有灰度值的均值减去\(C\);
第二种ADAPTIVE_THRESH_GAUSSIAN_C
,针对像素\((x, y)\)的计算方式如下:
- 首先,生成一个大小为\(blockSize \times blockSize\)的高斯核,作为权重;
- 其次,利用高斯核与\((x, y)\)邻域范围内灰度值,进行加权求和,再减去\(C\),得到\(T(x, y)\);
示例:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
/**
* adaptiveThreshold的使用
*/
int main(){
// 读取图像
Mat src = imread("/home/chen/dataset/lena.jpg");
if (! src.data){
cout << "could not load image." << endl;
return -1;
}
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
// 转成灰度图
Mat srcGray;
cvtColor(src, srcGray, COLOR_BGR2GRAY);
namedWindow("srcGray", WINDOW_AUTOSIZE);
imshow("srcGray", srcGray);
// 自适应阈值二值化
Mat srcBinary;
adaptiveThreshold(~srcGray, srcBinary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, -2);
namedWindow("srcBinary", WINDOW_AUTOSIZE);
imshow("srcBinary", srcBinary);
waitKey(0);
return 0;
}