1. 程式人生 > >理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)

一、簡介

我們知道,在一幅影象中,其低頻成分對應者影象變化緩慢的部分,對應著影象大致的相貌和輪廓。而其高頻成分則對應著影象變化劇烈的部分,對應著影象的細節(影象的噪聲也屬於高頻成分)。

低頻濾波器,顧名思義,就是過濾掉或者大幅度衰減影象的高頻成分,讓影象的低頻成分通過。低頻濾波器可以平滑影象,慮去影象的噪聲。而與此相反的高頻濾波器,則是過濾低頻成分,通過高頻成分,可以達到銳化影象的目的。

理想低通濾波器的濾波非常尖銳,而高斯低通濾波器的濾波則非常平滑。Butterworth低通濾波器則介於兩者之間,當Butterworth低通濾波器的階數較高時,接近於理想低通濾波器,階數較低時,則接近於高斯低通濾波器。

下面我們所說的都是對應於二維影象處理的情況。

二、這三種濾波器的相關介紹

在這三種低通濾波器的表示式中,我們都用D0來表示其截止頻率。D(u, v)表示距離頻率矩形中心的距離。


我並沒有說明振鈴現象產生的原因,只是說明了什麼情況下振鈴現象較為明顯。

1. 理想低通濾波器(ILPF)

理想低通濾波器在以原點為圓心、D0為半徑的園內,通過所有的頻率,而在圓外截斷所有的頻率。(圓心的頻率最低,為變換的直流(dc)分量)。函式如下:



可以看出,理想低通濾波器的過渡非常急劇,會產生振鈴現象。

2. Butterworth低通濾波器

函式表示式如下(在有些書中,Butterworth的函式的平方才等於右邊的表示式,在這裡我們按照課本的寫法,計算較為方便),其中n稱為Butterworth低通濾波器的階數:



從濾波器的函式圖中,我們可以看出其過渡沒有理想低通濾波器那麼劇烈,從圖(c)中可以看出,階數越高,濾波器的過度越劇烈,振鈴現象將越明顯。

3. 高斯低通濾波器(GLPF)

函式表示式如下:



高斯濾波器的過度特性非常平坦,因此不會產生振鈴現象。

三、頻域濾波步驟

1. 基本步驟

1. 給定一幅大小為m*n的影象f(x,y)。選擇適當的填充引數P和Q,一般令P = 2m,Q = 2n。

2. 對影象f(x, y)填充0,填充後得到影象大小為P*Q的影象fp(x, y)。

3. 用(-1)^(x+y)乘以fp(x,y)將其移到變換中心(中心化)。

4. 計算fp(x, y)的DFT,得到F(u,v)。 

5. 生成一個實的,對稱的濾波函式H(u, v),大小為P*Q,中心在(P/2, Q/2)處。然後相乘(矩陣點乘)得到G(u,v) = H(u,v)F(u,v)。

6. 對G(u, v)反傅立葉變換,然後取實部,再乘以(-1)^(x+y)進行反中心變換最後得到gp(x,y)。

7. 提取gp(x,y)左上角的m*n區域,對提取的部分進行標準化處理,得到最終的結果影象g(x,y)。

2. 相關步驟說明

1. 對影象進行0填充,得到大小為P*Q的影象,主要是為了避免在迴圈卷積中出現的纏繞錯誤。當兩個矩陣大小相同時,P≥2m-1,Q≥2n-1時可以避免環繞錯誤。由於對於偶數尺寸的矩陣計算其傅立葉變換較快,因此P取2m,Q取2n。

2. 影象乘以(-1)^(x+y),再對影象進行傅立葉變換可以得到將原點移到中心的傅立葉變換。這樣,對於F(u,v)來說,中心的頻率最低,四周的頻率較高。每一點的值表示該頻率對於的幅度。在matlab中,也可以不乘以(-1)^(x+y),直接對填充後的影象進行傅立葉變換,之後使用fftshift函式對其傅立葉變換進行中心化。得到的結果是一樣的。

3. 由於影象是一個實函式,所以其傅立葉變換是一個旋轉對稱的傅立葉變換。

4. 關於對稱中心。課本中指出,對於一個長度為M的一維序列,當M為偶數時,位置0和M/2呈現零的特性,當M為奇數時,只有位置0呈現零的特性。因此,在matlab中,由於矩陣下標是從1開始的,我們的P = 2m,Q = 2n。因此中心點的位置為(P/2+1, Q/2+1),即(m+1, n+1)。

5. 標準化處理。對最終得到的影象每一點的值進行處理。使其範圍變為[0, 255]的uint8。或者[0, 1.0]的double值。

四、matlab程式碼實現Butterworth低通濾波器

在使用matlab程式碼的實現過程中,對於這三種低通濾波器,只是在實驗低通濾波器函式H(u,v)的程式碼中有部分不同,其他部分一致。因此,在下面中,只給出實現Butterworth低通濾波器的程式碼,不給出其他兩種濾波器的程式碼。

1.  Butterworth濾波器的程式碼如下:

該函式為Bfilter,輸入為需要進行Butterworth濾波的灰度影象,Butterworth濾波器的截止頻率D0以及Butterworth濾波器的階數n。輸出為進行濾波之後的影象(影象的值已經歸一化到[[0, 255])。

function [image_out] = Bfilter(image_in, D0, N)
% Butterworth濾波器,在頻率域進行濾波
% 輸入為需要進行濾波的灰度影象,Butterworth濾波器的截止頻率D0,階數N
% 輸出為濾波之後的灰度影象

[m, n] = size(image_in);
P = 2 * m;
Q = 2 * n;

fp = zeros(P, Q);
%對影象填充0,並且乘以(-1)^(x+y) 以移到變換中心
for i = 1 : m
    for j = 1 : n
        fp(i, j) = double(image_in(i, j)) * (-1)^(i+j);
    end
end
% 對填充後的影象進行傅立葉變換
F1 = fft2(fp);

% 生成Butterworth濾波函式,中心在(m+1,n+1)
Bw = zeros(P, Q);
a = D0^(2 * N);
for u = 1 : P
    for v = 1 : Q
        temp = (u-(m+1.0))^2 + (v-(n+1.0))^2;
        Bw(u, v) = 1 / (1 + (temp^N) / a);
    end
end

%進行濾波
G = F1 .* Bw;

% 反傅立葉變換
gp = ifft2(G);

% 處理得到的影象
image_out = zeros(m, n, 'uint8');
gp = real(gp);
g = zeros(m, n);
for i = 1 : m
    for j = 1 : n
        g(i, j) = gp(i, j) * (-1)^(i+j);
        
    end
end
mmax = max(g(:));
mmin = min(g(:));
range = mmax-mmin;
for i = 1 : m
    for j = 1 : n
        image_out(i,j) = uint8(255 * (g(i, j)-mmin) / range);
    end
end

end

2. 測試程式碼如下

測試時Butterworth濾波器的階數為2。截止頻率分別為10,30,60,160,460。

clear all;
close all;
clc;

image1 = imread('3.bmp');

image2 = Bfilter(image1, 10, 2);
image3 = Bfilter(image1, 30, 2);
image4 = Bfilter(image1, 60, 2);
image5 = Bfilter(image1, 160, 2);
image6 = Bfilter(image1, 460, 2);

% 顯示影象
subplot(2,3,1), imshow(image1), title('原影象');
subplot(2,3,2), imshow(image2), title('D0 = 10, n = 2');
subplot(2,3,3), imshow(image3), title('D0 = 30, n = 2');
subplot(2,3,4), imshow(image4), title('D0 = 60, n = 2');
subplot(2,3,5), imshow(image5), title('D0 = 160, n = 2');
subplot(2,3,6), imshow(image6), title('D0 = 460, n = 2');

3. 執行結果如下,可以看出,與課本給出的結果一致。