天天看點

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器

一、簡介

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

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

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

下面我們所說的都是對應于二維圖像處理的情況。

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

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

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器

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

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

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

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器
理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器

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

2. Butterworth低通濾波器

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

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器
理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器

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

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

函數表達式如下:

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器
理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器

高斯濾波器的過度特性非常平坦,是以不會産生振鈴現象。

三、頻域濾波步驟

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. 運作結果如下,可以看出,與課本給出的結果一緻。

理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)一、簡介二、這三種濾波器的相關介紹三、頻域濾波步驟四、matlab代碼實作Butterworth低通濾波器

繼續閱讀