之前的時候,爲了過濾圖像中的一些噪點,學過一些簡單的濾波,好比中值濾波,均值濾波,也是本身實現的。函數
在opencv中有現成的函數能夠調用,實現濾波的操做。學習
函數的原型以下:ui
CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst, int smoothtype CV_DEFAULT(CV_GAUSSIAN), int size1 CV_DEFAULT(3), int size2 CV_DEFAULT(0), double sigma1 CV_DEFAULT(0), double sigma2 CV_DEFAULT(0));
前兩個參數是輸出圖像的指針,目標圖像的指針;spa
第三個參數是傳入一個值,表示如今濾波的方式;指針
最後四個值通常用來表示模板的大小code
平滑類型 | 名稱 | 支持 | 輸入數據類型 | 輸出數據類型 | 簡要說明 | |
CV_BLURblog |
簡單模糊 | 對每一個像素點作size1*size2模板的求和sum,在ret=sum/(size1*size2) | ||||
CV_BLUR_NO_SCALE圖片 |
簡單無縮放變化的模糊 | 對每一個像素點作size1*size2模板的求和sum,ret=sum | ||||
CV_MEDIAN | 中值模糊 | 對圖像進行size1*size2模板的取中位數,ret=中位數 | ||||
CV_GAUSSIAN | 高斯模糊 | 是一種加權平均的過程,若使用3×3模板,則計算公式以下g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1)+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16; | ||||
CV_BILATERAL | 雙邊濾波 |
對雙邊濾波瞭解的很少,下篇在細講下= =內存
函數的使用方法:原型
#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/lv2.jpg");//讀取圖片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1顯示圖片 // cvCopy(img,temp); IplImage* temp=cvCreateImage( //建立一個size爲image,三通道8位的彩色圖 cvGetSize(img), IPL_DEPTH_8U, 3 ); cvSmooth(img,temp,CV_BLUR,3,3);//簡單模糊 cvShowImage("Example2",temp); cvSmooth(img,temp,CV_BLUR_NO_SCALE,3,3);//簡單無縮放變化的模糊 cvShowImage("Example3",temp); cvSmooth(img,temp,CV_MEDIAN,3,3);//中值模糊 cvShowImage("Example4",temp); cvSmooth(img,temp,CV_GAUSSIAN,3,3);//高斯模糊 cvShowImage("Example5",temp); cvSmooth(img,temp,CV_BILATERAL,1,150,240,480);//雙邊濾波 cvShowImage("Example6",temp); cvWaitKey(0);//暫停用於顯示圖片 cvReleaseImage(&img);//釋放img所指向的內存空間而且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); cvDestroyWindow("Example4"); cvDestroyWindow("Example5"); cvDestroyWindow("Example6"); return 0; }
參考:學習opencv