卷積定理
函數空間域的卷積的傅里葉變換是函數傅里葉變換的乘積。對應地,頻率域的卷積與空間域的乘積存在對應關系。
即:


由卷積定理可知所有頻域的濾波理論上都可以轉化為空域的卷積操作。
給定頻率域濾波器,可對其進行傅里葉逆變換得到對應的空域濾波器;濾波在頻域更為直觀,但空域適合使用更
小的濾波模板以提高濾波速度。因為相同尺寸下,頻域濾波器效率高於空域濾波器,故空域濾波需要一個更小尺寸的模板近似得到需要的濾波結果。
空域卷積
將模板在圖像中逐像素移動,將卷積核的每個元素分別和圖像矩陣對應位置元素相乘並將結果累加,累加和作為模板中心對應像素點的卷積結果。通俗的講,卷積就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均后得到。在像素的處理上,是先將結果暫存在於一個副本,最后統一拷貝,故不會出現處理順序不同而結果不同的情況。
二維連續卷積的數學定義:

離散形式:

頻域濾波:
頻率域是由傅里葉變換和頻率變量 (u,v)定義的空間,頻域濾波處理過程:先對圖像進行傅里葉變換,轉換至頻率域,在頻域使用濾波函數進行濾波,最后將結果反變換至空間域。即:

高斯函數:

形狀:

高斯函數的特殊性:高斯函數傅里葉變換仍是高斯函數,但標准差已經變化,頻域標准差越大(高斯函數越寬),變換后空域標准差越小(高斯函數越窄)。
如頻域函數
對應的空域函數為
空域高斯平滑濾波:
高斯模板的生成
因為圖像是離散存儲的,故我們需要一個高斯函數的離散近似。具體地,對高斯函數進行離散化,以離散點上的高斯函數值作為權值,組成一定尺寸的模板,用此模板對圖像進行卷積。由於高斯分布在任意點處都非零,故理論上需要一個無窮大的模板,但根據"准則",即數據分布在的概率是0.9974,距離函數中心超過數據所占權重可以忽略,因此只需要計算的矩陣就可以保證對高斯函數的近似了。
假設二維模板大小,則模板上元素 處的值為:
前面的系數在實際應用中常被忽略,因為是離散取樣,不能使取樣和為1,最后還要做歸一化操作。
程序:
function filt=mygaussian(varargin) %參數初始化,使用varargin處理可變參數情況 siz=varargin{1};%模板尺寸 if(numel(siz)==1) siz=[siz,siz]; end std=varargin{2};%方差 centa = (siz(1)+1)/2;%此處不要取整 centb = (siz(1)+1)/2; filt = zeros(siz(1),siz(2)); summ=0; for i=1:siz(1) for j=1:siz(2) radius = ((i-centa)^2+(j-centb)^2); filt(i,j) = exp(-(radius/(2*std^2))); summ=summ+filt(i,j); end end filt=filt/summ;%歸一化
測試:
執行mygaussian(4,1)得:
0.0181 0.0492 0.0492 0.0181
0.0492 0.1336 0.1336 0.0492
0.0492 0.1336 0.1336 0.0492
0.0181 0.0492 0.0492 0.0181
執行fspecial('gaussian',4,1)得:
0.0181 0.0492 0.0492 0.0181
0.0492 0.1336 0.1336 0.0492
0.0492 0.1336 0.1336 0.0492
0.0181 0.0492 0.0492 0.0181
可以看出與Matlab結果相同。
查看fspecial的Matlab源碼,將gaussian部分提取出來:
function h = hisfspecial(varargin) siz=varargin{1}; if(numel(siz)==1) siz=[siz,siz]; end std = varargin{2}; siz = (siz-1)/2; [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1)); arg = -(x.*x + y.*y)/(2*std*std); h = exp(arg); h(h<eps*max(h(:))) = 0; sumh = sum(h(:)); if sumh ~= 0, h = h/sumh; end;
與mygaussian類似,只是更具Matlab特色。
模板與圖像卷積
直接利用Matlab提供的fspecial、imfilter。
I=imread('lena.bmp'); h=fspecial('gaussian',7,8); O=imfilter(I,h,'replicate','same','conv'); subplot(1,2,1);imshow(I,[]);title('input'); subplot(1,2,2);imshow(O,[]);title('output');
具體的實現細節還有很多值得研究的,如邊界處理、將二維高斯模板分解為兩個一維模板等。可參考文后鏈接。
結果:

頻域高斯低通濾波
在頻率域,高斯函數表示為:

或寫成:

其中
為截止頻率,
為圖像頻率空間點(u,v)處的值,
;可以看出距離頻率空間的(0,0)處越遠,
越大,也就是頻率越高。而對高斯函數
距離中心點 越遠值越小,故利用
可以濾除高頻,保留低頻。
程序:
I=imread('lena.bmp'); I=double(I); [M,N]=size(I); m=(M+1)/2; n=(N+1)/2; d0=30; %截止頻率 F=fftshift(fft2(I)); %空域轉頻域,平移中心 H=zeros(M,N); G=zeros(M,N); for i=1:M for j=1:N d=(i-m)^2+(j-n)^2; H(i,j)=exp(-d/(2*d0^2)); G(i,j)=H(i,j)*F(i,j); end end O=ifft2(ifftshift(G)); %平移中心,頻域轉空域 O=real(O); %取實數部分 subplot(1,2,1);imshow(I,[]);title('inpit'); subplot(1,2,2);imshow(O,[]);title('output');
對比
方差:空域高斯函數的方差越大,高斯函數越寬,模板尺寸越大,處理的圖像越模糊;
頻域高斯函數的方差越小,高斯函數越窄,濾除的低頻成分越多,圖像越模糊;
計算量:空域高斯濾波的計算花費隨着模板的規模的增大而增大;頻域高斯濾波的計算量獨立於濾波函數。
注:Matlab中提供了兩個類似的空域濾波操作:卷積、相關,它們的不同之處是:卷積操作在計算前會先將模板旋轉180度,下面會給出驗證(對於我們的高斯模板沒有影響,因為高斯模板是對稱的)。
驗證:
f=[0 0 0 0 0;
0 0 0 0 0 ;
0 0 1 0 0;
0 0 0 0 0;
0 0 0 0 0];
g=[1 2 3 ;
4 5 6 ;
7 8 9];
w1=imfilter(f,g,'conv');
w2=imfilter(f,g,'corr');
w1 =
0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0
w2 =
0 0 0 0 0
0 9 8 7 0
0 6 5 4 0
0 3 2 1 0
0 0 0 0 0
參考
[1] http://blog.csdn.net/likezhaobin/article/details/6835049
[2]http://blog.csdn.net/zddblog/article/details/7450033
[3]http://homepages.inf.ed.ac.uk/rbf/HIPR2/freqfilt.htm
[4]http://blog.csdn.net/zddblog/article/details/7521424
原文鏈接:https://blog.csdn.net/u010839382/article/details/41908541
