天天看點

opencv--門檻值

全局門檻值

threshold 方法是通過周遊灰階圖中點,将圖像資訊二值化,處理過後的圖檔隻有二種色值。

其函數原型如下:

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
           

參數資訊:

第一個參數,InputArray類型的src,輸入數組,填單通道 , 8或32位浮點類型的Mat即可。

第二個參數,OutputArray類型的dst,函數調用後的運算結果存在這裡,即這個參數用于存放輸出結果,且和第一個參數中的Mat變量有一樣的尺寸和類型。

第三個參數,double類型的thresh,門檻值的具體值。

第四個參數,double類型的maxval,當第五個參數門檻值類型type取 THRESH_BINARY 或THRESH_BINARY_INV門檻值類型時的最大值.

第五個參數,int類型的type,門檻值類型,。

其它參數很好了解,我們來看看第五個參數,第五參數有以下幾種類型

0: THRESH_BINARY  目前點值大于門檻值時,取Maxval,也就是第四個參數,下面再不說明,否則設定為0

1: THRESH_BINARY_INV 目前點值大于門檻值時,設定為0,否則設定為Maxval

2: THRESH_TRUNC 目前點值大于門檻值時,設定為門檻值,否則不改變

3: THRESH_TOZERO 目前點值大于門檻值時,不改變,否則設定為0

4: THRESH_TOZERO_INV  目前點值大于門檻值時,設定為0,否則不改變

官方解釋如下圖:

opencv--門檻值

下面是簡單應用執行個體代碼片段

int main(){
    int nY20_thresh=96;

    int nY20_MaxThesh=255;

    void _onY20thresh(int,void*){

    Mat src;

    m_Mat.copyTo(src);


    Mat dst,edge,gray;


    // 【1】建立與src同類型和大小的矩陣(dst)

    dst.create( src.size(), src.type() );


    // 【2】将原圖像轉換為灰階圖像

    cvtColor( src, gray, CV_BGR2GRAY );


    // 【3】先用使用 3x3核心來降噪

    blur( gray, edge, Size(3,3) );


    //type選THRESH_BINARY,大于門檻值的設定為maxval(255),其它置0

    threshold(edge, dst, nY20_thresh, 255, THRESH_BINARY);



    CVShow("threshold二值化灰圖",dst,400,400);



}
           

效果如下:

opencv--門檻值

自适應門檻值

在圖像門檻值化操作中,我們更關心的是從二值化圖像中分離目标區域背景區域,僅僅通過設定固定門檻值很難達到理想的分割效果。在實踐應用中,目标及背景區域通常互相依存在圖像塊中,我們可以通過圖像像素領域快的分布特征來自适應确定門檻值的二值化門檻值。對于圖像塊中亮度變化明顯的區域,自适應門檻值通常會設定的比較大或者比較小,進而保證圖像中各個像素的門檻值會随着周圍領域的變化而變化。

opencv中提供了自适應門檻值化函數adaptiveThreshold,該函數有兩種自适應門檻值化類型參數可供選擇,用來對目前像素點與領域像素塊進行門檻值計算。

void adaptiveThreshold(InoutArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C)

實作圖像的自适應門檻值化操作。參數src表示源圖像數組(單通道8位圖像)。參數dst表示輸出圖像組(與輸入圖像同樣的尺寸和類型)。參數maxVal表示預示滿足條件的最大值。參數adaptiveMethod表示自适應門檻值算法選擇ADAPTIVE_THRESHOLD_MEAN_C或者ADAPTIVE_THRESHOLD_GAUSSIAN_C。參數thresholdType表示門檻值類型THRESHOLD_BINARY和THRESHOLD_BINARY_INV。參數blockSize表示領域塊的大小,用來計算區域門檻值,一般選擇3、5、7............。參數C表示常數,它是一個從均值或者權重均值提取的常數,可以是負數。

代碼如下:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <stdio.h>
#include <string>


using namespace std;
using namespace cv;


int main()
{
cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\RGBFlower4.jpg");

if(srcImage.empty())
{ 
return-1;
}

cv::imshow("原圖像", srcImage);

//灰階轉換
cv::Mat srcGray;
cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
cv::imshow("srcGray", srcGray);

cv::Mat dstImage;

//初始化自适應門檻值參數
int blockSize =5;
int constValue =20;
int maxValue =255;

//自适應門檻值算法0:ADAPTIVE_THRESHOLD_MEAN_C,1:ADAPTIVE_GAUSSIAN_MEAN_C
//門檻值類型,0:THRESHOLD_BINARY,1:THRESHOLD_BINARY_INV
int adaptiveMthod =0;
int thresholdType =1;

//圖像自适應門檻值操作
cv::adaptiveThreshold(srcGray, dstImage, maxValue, adaptiveMthod, thresholdType, blockSize, constValue);
cv::imshow("dstImage", dstImage);

cv::waitKey(0);

//預設最大值
const int maxVal =255;

return 0;
}