OpenCV入門(十二) 閾值化

2021-06-26 13:52:53 字數 3678 閱讀 2825

閾值化的基本思想是:給定乙個陣列和乙個閾值,然後根據陣列中的每個元素是低於還是高於閾值而進行一些處理。

函式宣告:

對陣列元素進行固定閾值操作

void cvthreshold( const cvarr* src, cvarr* dst, double threshold,

double max_value, int threshold_type );

src

原始陣列 (單通道 , 8-bit of 32-bit 浮點數).

dst輸出陣列,必須與 src 的型別一致,或者為 8-bit.

threshold

閾值

max_value

使用 cv_thresh_binary 和 cv_thresh_binary_inv 的最大值.

threshold_type

閾值型別 (見討論)

函式 cvthreshold 對單通道陣列應用固定閾值操作。該函式的典型應用是對灰度影象進行閾值操作得到二值影象。(cvcmps 也可以達到此目的) 或者是去掉雜訊,例如過濾很小或很大象素值的影象點。本函式支援的對影象取閾值的方法由 threshold_type 確定:

threshold_type=cv_thresh_binary:

dst(x,y) = max_value, if src(x,y)>threshold

0, otherwise

threshold_type=cv_thresh_binary_inv:

dst(x,y) = 0, if src(x,y)>threshold

max_value, otherwise

threshold_type=cv_thresh_trunc:

dst(x,y) = threshold, if src(x,y)>threshold

src(x,y), otherwise

threshold_type=cv_thresh_tozero:

dst(x,y) = src(x,y), if (x,y)>threshold

0, otherwise

threshold_type=cv_thresh_tozero_inv:

dst(x,y) = 0, if src(x,y)>threshold

src(x,y), otherwise

下面是圖形化的閾值描述:

實現**:

/*

* 閾值化

*/#include "highgui.h"

#include "cv.h"

#includevoid sum_rgb(iplimage* img, iplimage* dst);

void dothreshold(iplimage* img)

} cvdestroywindow("thresh");

cvreleaseimage(&img);

cvreleaseimage(&dst);

}void sum_rgb(iplimage* img, iplimage* dst)

實現結果:

用注釋部分的程式替換:另一種組合不同通道,並閾值化影象的方法

/*

* 閾值化

*/#include "highgui.h"

#include "cv.h"

#includevoid sum_rgb(iplimage* img, iplimage* dst);

void dothreshold(iplimage* img)

} cvdestroywindow("thresh");

cvreleaseimage(&img);

cvreleaseimage(&dst);

}void sum_rgb(iplimage* img, iplimage* dst)

結果:

這是一種改進的閾值技術,其中閾值本身是乙個變數。

函式宣告:

自適應閾值方法

void cvadaptivethreshold( const cvarr* src, cvarr* dst, double max_value,

int adaptive_method=cv_adaptive_thresh_mean_c,

int threshold_type=cv_thresh_binary,

int block_size=3, double param1=5 );

src

輸入影象.

dst輸出影象.

max_value

使用 cv_thresh_binary 和 cv_thresh_binary_inv 的最大值.

adaptive_method

自適應閾值演算法使用:cv_adaptive_thresh_mean_c 或 cv_adaptive_thresh_gaussian_c (見討論).

threshold_type

取閾值型別:必須是下者之一

block_size

用來計算閾值的象素鄰域大小: 3, 5, 7, ...

param1

與方法有關的引數。對方法 cv_adaptive_thresh_mean_c 和 cv_adaptive_thresh_gaussian_c, 它是乙個從均值或加權均值提取的常數(見討論), 儘管它可以是負數。

函式 cvadaptivethreshold 將灰度影象變換到二值影象,採用下面公式:

threshold_type=cv_thresh_binary:

dst(x,y) = max_value, if src(x,y)>t(x,y)

0, otherwise

threshold_type=cv_thresh_binary_inv:

dst(x,y) = 0, if src(x,y)>t(x,y)

max_value, otherwise

其中 ti 是為每乙個象素點單獨計算的閾值

對方法 cv_adaptive_thresh_mean_c,先求出塊中的均值,再減掉param1。

對方法 cv_adaptive_thresh_gaussian_c ,先求出塊中的加權和(gaussian), 再減掉param1。

實現**:

/*

* 自適應閾值

*/#include "cv.h"

#include "highgui.h"

#include "math.h"

void doadaptthreshold(iplimage* img)

結果:

第一張圖為原圖的灰度圖

第二張圖為二值閾值化

第三張為自適應二值閾值化

opencv雙閾值化

對於影象中有明顯的雙分界特徵,我們考慮用雙閾值方法進行二值化操作。根據雙閾值操作方法,對於8位灰度圖應用該閾值化方法操作時,預先設定好特 定的閾值量thresh1,thresh2,並且thresh 如下 include opencv2 highgui highgui.hpp include open...

Python呼叫OpenCV閾值化

這一篇主要有兩點 普通閾值化和自適應閾值化。普通閾值化用到的函式是cv2.threshold,其函式原型為 threshold src,thresh,maxval,type,dst none 其中,type的取值有以下幾種cv2.thresh binary cv2.thresh binary inv...

opencv 學習之 閾值化 2 自適應閾值

自適應閾值化函式 void cvadaptivethreshold const cvarr src,cvarr dst,double max value,int adaptive method cv adaptive thresh mean c,int threshold type cv thres...