OpenCV之cvSmooth函數平滑濾波

1、cvSmooth函數用法

定義原型

  void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,
              int param1, int param2, double param3, double param4 );
src:輸入圖像.
dst:輸出圖像.
smoothtype平滑方法:
CV_BLUR_NO_SCALE(簡單不帶尺度變換的模糊) - -對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函數 cvIntegral 計算積分圖像。
CV_BLUR (simple blur)- -對每個象素param1×param2鄰域求和並做尺度變換 1/(param1×param2)。
CV_GAUSSIAN(gaussian blur) - -對圖像進行核大小爲 param1×param2 的高斯卷積。
CV_MEDIAN(median blur) - -對圖像進行核大小爲param1×param1 的中值濾波 (鄰域是方的)。
CV_BILATERAL(雙向濾波) - -應用雙向 3x3 濾波,彩色 sigma=param1,空間 sigma=param2.。

   關於雙向濾波,可參考http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
param1
平滑操作的第一個參數.
param2
平滑操作的第二個參數. 對於簡單/非尺度變換的高斯模糊的情況,如果param2的值爲零,則表示其被設定爲param1。
param3
對應高斯參數的 Gaussian sigma (標準差). 如果爲零,則標準差由下面的核尺寸計算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核,n=param2 對應垂直核.
對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標準 sigma 速度會快。如果 param3 不爲零,而 param1 和 param2 爲零,則核大小由sigma 計算 (以保證足夠精確的操作).

  函數 cvSmooth 可使用上面任何一種方法平滑圖像。每一種方法都有自己的特點以及侷限。
  沒有縮放的圖像平滑僅支持單通道圖像,並且支持8位到16位的轉換(與cvSobel和cvaplace相似)和32位浮點數到32位浮點數的變換格式。
 簡單模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮點圖像。這兩種方法可以(in-place)方式處理圖像。
 中值和雙向濾波工作於 1- 或 3-通道, 8-位圖像,但是不能以 in-place 方式處理圖像.



2、實例(OpenCV 1.0+VC6.0)

   原圖像爲495x460的單通道灰度圖像,已經加有一定程度的椒鹽噪聲。

   關鍵代碼爲:

//鄰域平均濾波
cvSmooth(pImg,pImg,CV_BLUR,3,3,0,0);           //3x3
cvSmooth(pImg,pImg,CV_BLUR,5,5,0,0);          //5x5

//中值濾波
 cvSmooth(pImg,pImg,CV_MEDIAN,3,3,0,0);    //3x3
 cvSmooth(pImg,pImg,CV_MEDIAN,5,5,0,0);    //5x5
//高斯濾波
 cvSmooth(pImg,pImg,CV_GAUSSIAN,3,3,0,0);//3x3
 cvSmooth(pImg,pImg,CV_GAUSSIAN,5,5,0,0);//5x5


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章