到今天為止,已經接觸影象處理行業四年左右,但是大部分時間都是在呼叫別人已經封裝好的函式,即傳說中的掉包俠。雖然清楚演算法原理,但是自己從來沒有比較系統的實現過乙個演算法。今天就以均值濾波演算法為例,用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個數字...