C 版本OpenCv教程 二十九 方框濾波

2021-10-14 11:00:15 字數 3018 閱讀 9486

方框濾波是均值濾波的一般形式,在均值濾波中,將濾波器中所有的畫素值求和後的平均值作為濾波後結果,方框濾波也是求濾波器內所有畫素值的之和,但是方框濾波可以選擇不進行歸一化,就是將所有畫素值的和作為濾波結果,而不是所有畫素值的平均值。

opencv 4中提供了boxfilter()函式實現方框濾波,該函式的函式原型在**清單5-10中給出。

void cv:

:boxfilter

(inputarray src,

outputarray dst,

int ddepth,

size ksize,

point anchor =

point(-

1,-1

),bool normalize = true,

int bordertype = border_default

)

該函式的使用方式與均值濾波函式blur()幾乎一樣,但是該函式可以選擇輸出影象的資料型別,除此之外,該函式的第六個引數表示是否對濾波器內所有的數值進行歸一化操作,引數預設狀態下需要對濾波器內所有的數值進行歸一化。此時,在不考慮資料型別的情況下,框濾波函式boxfilter()和均值濾波函式blur()會具有相同的濾波結果。除了對濾波器內每個畫素值直接求和外,opencv 4還提供了sqrboxfilter()函式實現對濾波器內每個像數值的平方求和,之後根據輸入引數選擇是否進行歸一化操作,該函式的函式原型在**清單5-11中給出。

void cv:

:sqrboxfilter

(inputarray src,

outputarray dst,

int ddepth,

size ksize,

point anchor =

point(-

1,-1

),bool normalize = true,

int bordertype = border_default

)

該函式是在boxfilter()函式功能基礎上進行擴充套件功能,因此兩者具有相同的輸入引數需求,這裡對函式的引數不再進行逐一解釋。cv_8u資料型別的影象畫素值從0到255,計算平方後資料會變得更大,即使歸一化操作也不能保證畫素值不會超過最大值,但是cv_32f資料型別的影象畫素值是從0到1之間的小數,在0到1之間的數計算平方會變得更小,但是始終保持在0到1之間。因此該函式在處理影象濾波的任務時主要針對的是cv_32資料型別的影象,而且根據計算關係可知,在歸一化後影象在變模糊的同時亮度也會變暗。

為了更加了解方框濾波的計算原理,清楚歸一化操作和未歸一化操作對濾波結果的影響,在**清單5-12中給出了分別利用方框濾波處理矩陣資料和影象的示例程式。程式中我們建立了乙個mat型別的資料,之後用sqrboxfilter()函式進行方框濾波,並在圖5-13給出歸一化後和未歸一化後的結果,同時使用boxfilter()函式和sqrboxfilter()對影象進行方框濾波操作,處理結果如圖5-12中所示。

#include

#include

using namespace cv;

using namespace std;

intmain()

//驗證方框濾波演算法的資料矩陣

float points[25]

=;mat data(5

,5,cv_32fc1,points)

;//將cv_8u型別資料轉換成cv_32f型別

mat luffy_32f;

luffy.

convertto

(luffy_32f,cv_32f,

1.0/

255)

; mat resultnorm,result,datasqrnorm,datasqr,luffy_32fsqr;

//方框濾波boxfilter()和sqrboxfilter()

boxfilter

(luffy,resultnorm,-1

,size(3

,3),

point(-

1,-1

),true)

;//進行歸一化

boxfilter

(luffy,result,-1

,size(3

,3),

point(-

1,-1

), false)

;//不進行歸一化

sqrboxfilter

(data,datasqrnorm,-1

,size(3

,3),

point(-

1,-1

),true,border_constant)

;//進行歸一化

sqrboxfilter

(data,datasqr,-1

,size(3

,3),

point(-

1,-1

),false,border_constant)

;//不進行歸一化

sqrboxfilter

(luffy_32f,luffy_32fsqr,-1

,size(3

,3),

point(-

1,-1

), true,border_constant)

;//顯示處理結果

C 學習(二十九)內聯inline

內聯函式適用能夠快速執行的函式,此時使用內聯省去了函式的呼叫開銷。內聯函式像巨集一樣都是在編譯期展開,內嵌到呼叫處。inline省去普通函式的壓棧和call,以空間換時間,僅僅省去了函式呼叫的開銷 當函式體比較小的時候,內聯該函式可以令目標 更加高效.對於訪問函式以及其它函式體比較短,效能關鍵的函式...

WPF教程(二十九)Grid行和列

上一章我們介紹了重要的grid面板,還展示了一些如何使用它的例子。這一章我們來做一些更深入的研究,這正是grid真正閃光的地方。首先,加入更多的行和列,實現乙個真正的 布局。一共9個按鈕,排布在三行三列的 中。我們又使用到了帶 號的寬度,這次還加了乙個數字。第一行的高度是2 第一列的寬度的也是2 它...

C核心技術手冊(二十九)

指標和陣列名,還有函式名也遵循隱式和顯式型別轉換,結構體和聯合體不能轉換,雖然它們的指導可以轉換為其他的指標型別。4.2.1 陣列和函式操作指示符 乙個陣列或函式操作指示符為具有型別的任何表示式,在大多數情況下,編譯器隱式地轉換乙個陣列的型別,及陣列的名子轉為陣列首元素的指標,陣列表示式在以下情景下...