opencv 线性滤波器
- 用OpenCV函數?filter2D?創建自己的線性濾波器。
原理
Note
?以下解釋節選自Bradski and Kaehler所著?Learning OpenCV?。
卷積
高度概括地說,卷積是在每一個圖像塊與某個算子(核)之間進行的運算。
核是什么?
核說白了就是一個固定大小的數值數組。該數組帶有一個?錨點?,一般位于數組中央。
如何用核實現卷積?
假如你想得到圖像的某個特定位置的卷積值,可用下列方法計算:
用公式表示上述過程如下:
幸運的是,我們不必自己去實現這些運算,OpenCV為我們提供了函數?filter2D?。
代碼
下面這段程序做了些什么?
-
載入一幅圖像
-
對圖像執行?歸一化塊濾波器?。舉例來說,如果該濾波器核的大小為??,則它會像下面這樣:
程序將執行核的大小分別為3、5、7、9、11的濾波器運算。
-
該濾波器每一種核的輸出將在屏幕上顯示500毫秒
本教程代碼所示如下。你也可以從?這里?下載。
說明
載入一幅圖像
src = imread( argv[1] );if( !src.data ){ return -1; }創建窗口以顯示結果
namedWindow( window_name, CV_WINDOW_AUTOSIZE );初始化線性濾波器的參數
anchor = Point( -1, -1 ); delta = 0; ddepth = -1;執行無限循環。在循環中,我們更新了核的大小,并將線性濾波器用在輸入圖像上。下面,我們詳細分析一下該循環:
首先,我們定義濾波器要用到的核。像下面這樣:
kernel_size = 3 + 2*( ind%5 ); kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);第一行代碼將?核的大小?設置為??范圍內的奇數。第二行代碼把1填充進矩陣,并執行歸一化——除以矩陣元素數——以構造出所用的核。
將核設置好之后,使用函數?filter2D?就可以生成濾波器:
filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );其中各參數含義如下:
#. 我們在程序里寫了個?while?循環。每隔500毫秒,濾波器的核將在我們所指定的范圍內更新。 結果 ========
編譯好上述代碼之后,輸入圖像路徑的參數,我們就可以執行這個程序。其輸出結果是一個窗口,其中顯示了由歸一化濾波器模糊之后的圖像。每過0.5秒,濾波器核的大小會有所變化,如你在下面幾張圖像中所見:
總結
以上是生活随笔為你收集整理的opencv 线性滤波器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv 图像阈值分割图像
- 下一篇: opencv图像边界的填充