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;
}