在Opencv環境下用C 實現均值濾波

2021-09-25 02:25:19 字數 2366 閱讀 8360

到今天為止,已經接觸影象處理行業四年左右,但是大部分時間都是在呼叫別人已經封裝好的函式,即傳說中的掉包俠。雖然清楚演算法原理,但是自己從來沒有比較系統的實現過乙個演算法。今天就以均值濾波演算法為例,用c++自行實現。均值濾波演算法的原理比較簡單,這裡就不再贅述。

效果圖

執行時間對比

**:

//

//#include using namespace std;

using namespace cv;

void meanimage(mat& src, mat& dst); //均值濾波

int main()

void meanimage(mat& src,mat& dst)

}}

上面的**雖然實現了均值濾波的功能,但是我們需要解決**中存在的如下諸多缺陷:

1.掩模尺寸不能改變,只能實現掩模尺寸為3x3的濾波

2.沒有對影象邊界的畫素進行處理

3.演算法沒有經過優化,因此執行時間太長

效果圖同上,這裡就不再給出。但值得注意的一點是,到目前為止的**都沒有考慮邊界畫素的處理問題,因此結果圖中寬度為(height-1)/2的邊界畫素值都為0 ,其中height為掩模的高度(掩模的寬高相等)。

邊界畫素值為0 

**:

//

//#include using namespace std;

using namespace cv;

void meanimage(mat& src, mat& dst, size ksize); //均值濾波

int main()

void meanimage(mat& src,mat& dst,size ksize)

//確保掩模寬高為奇數

if (ksize.height % 2 ==0)

//掩模寬高的一半

int hh = (ksize.height - 1) / 2;

int hw = (ksize.width - 1) / 2;

//遍歷除邊界畫素外的所有畫素

int sum = 0;

for (size_t r = hh; r < src.rows - hh; r++)

}//求均值並賦值給相應位置的畫素

dst.at(r,c) = sum / ksize.area();

sum = 0;

} }}

可直接呼叫opencv中的copymakeborder函式對影象邊界畫素進行擴充,此函式本文不做過多介紹,詳情可參考張美麗的部落格。對邊界擴充後的效果圖:略

**:

//

//#include using namespace std;

using namespace cv;

void meanimage(mat& src, mat& dst, size ksize); //均值濾波

int main()

void meanimage(mat& src,mat& dst,size ksize)

//確保掩模寬高為奇數

if (ksize.height % 2 ==0)

//掩模寬高的一半

int hh = (ksize.height - 1) / 2;

int hw = (ksize.width - 1) / 2;

//擴充邊緣畫素

mat makeborder;

copymakeborder(src, makeborder, hh, hh, hw, hw, border_reflect_101);

//遍歷除邊界畫素外的所有畫素

int sum = 0;

for (size_t r = hh; r < src.rows + hh; r++)

}//求均值並賦值給相應位置的畫素

dst.at(r-hh,c-hw) = sum / ksize.area();

sum = 0;

} }}

opencv在Mac環境下的安裝和配置

今天嘗試用xcode整合opencv動態庫來處理,將opencv的安裝和在xcode上的配置記錄下來,以供參考。一 opencv的安裝 1.首先檢查有沒有安裝cmake 終端上cmake version 檢查版本情況確定。如果沒有安裝,先安裝一下 brew install cmake 2.安裝ope...

在windwos環境下用gcc編譯boost動態庫

之前在網上也下過一些別人編譯好的boost動態庫或者靜態庫檔案,發現都不是很好用,因此決定自己重新編譯。解壓,得到boost庫的源 得到boost 1 65 1檔案。首先需要安裝gcc編譯器,因為我在windows系統上已經安裝了帶有mingw gcc的windwos版本 qt環境,所以不需要再安裝...

在OpenCV裡用kNN實現手寫數字識別

本文裡將要學習用knn來構造乙個ocr應用,實現手寫數字的識別。為了實現這個需求,我們需要一些訓練資料和測試資料,在opencv裡有乙個手寫數字的digits.png,這個裡包含有5000個手寫字型的數字,每個數字有500個,每個數字大小為20x20個畫素。如下圖所示 因此,首先就是把5000個數字...