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