MATLAB實現圖像巴特沃斯濾波、高頻增強濾波及直方圖均衡化

1、巴特沃斯濾波器

1.1 基本概念

在圖像處理中,巴特沃斯濾波器傳遞函數如下:
巴特沃斯低通濾波器公式:
巴特沃斯低通濾波器
巴特沃斯高通濾波器公式:
巴特沃斯高通濾波器
在公式中,D(u,v)代表頻域當中,點(u,v)到中心點的距離,我們知道二維圖像的傅里葉變換的頻域幅值圖大概是長這樣的:
二維傅里葉變換
所以中心點也就是(M/2,N/2),M和N代表圖像的長和寬,那麼D(u,v)就可以用下面的式子來表示了:
表達式
而D0就是截止距離了,就相當於在頻域當中畫一個圈,對圈內或者圈外保留就可以達到所謂的低通和高通了,這個D0就相當於一維當中的截止頻率。

1.2 MATLAB實現

有了上面的概念理解,程序實現起來也不難了。基本的思路就是先對圖像進行二維傅里葉變換,之後根據公式設計巴特沃斯濾波器的傳遞函數,在頻域對圖像進行處理,最後再傅里葉反變換回來就結束了。具體代碼如下:

clear all;
clc;

%% 讀取原圖像
Original_image=imread('Origin.tif');
[len,wid]=size(Original_image);
Original_image=im2double(Original_image);
g=fft2(Original_image); %二維傅立葉變換
g=fftshift(g);  %頻移

%% 設計巴特沃斯濾波器
n1=2;   %巴特沃斯濾波器階數爲2
D0=0.05*len;  %截止頻率5%的圖像寬度
[M,N]=size(g);
m=fix(M/2);
n=fix(N/2);
for i=1:M
   for j=1:N
        D=sqrt((i-m)^2+(j-n)^2);
        h1=1/(1+(D0/D)^(2*n1));   %計算高通濾波器傳遞函數
        h2=0.5+2*h1;    %設計high-frequency emphasis其中a=0.5,b=2.0
        s1(i,j)=h1*g(i,j);  %用設計的濾波器處理原圖像
   end
end


%% 傅里葉反變換後
filter_image1=im2uint8(real(ifft2(ifftshift(s1))));  %傅里葉反變換

%% 變換前後圖像顯示
subplot(1211),imshow(Original_image),title('(a) A chest X-ray image');
subplot(122),imshow(filter_image1),title('(b) Result of Butterworth highpass filtering');

1.3 處理結果

由於截止頻率比較高,所以背景比較黑,邊界也看不清楚
巴特沃斯處理結果

2、高頻增強濾波器(High-Frequency Emphasis Filtering)

2.1 基本概念

高頻增強濾波器的傳遞函數如下:
在這裏插入圖片描述
其中a>=0,b>a,Hhp(u,v)表示高通濾波器,這個濾波器在保留高頻分量的同時,也加入了背景的低頻成分。

2.2 Matlab實現

這個也比較簡單,只要在上面的

       h1=1/(1+(D0/D)^(2*n1));   %計算高通濾波器傳遞函數

這句代碼的後面添加一句就行了:

h2=0.5+2*h1;    %設計high-frequency emphasis其中a=0.5,b=2.0
s2(i,j)=h2*g(i,j);  %用設計的high-frequency emphasis濾波器處理原圖像

之後同樣是反變換一下得到變換後的圖像:

filter_image2=im2uint8(real(ifft2(ifftshift(s2))));  %傅里葉反變換
subplot(121),imshow(Original_image),title('(a) A chest X-ray image');
subplot(122),imshow(filter_image2),title('(b) Result of high-frequency emphasis filtering');

2.3 處理結果

可以看到這張的邊界更加清晰一些了
高頻增強

3、直方圖均衡化

3.1 基本概念

直方圖均值通俗來說就是把一幅圖像的灰度值集合,通過一定的映射關係,映射到另一個灰度值集合中,其目的就是爲了使各個灰度級點數比較均衡同時達到增強對比度的效果,具體怎麼做我也不介紹了,網上的資料也比較多。這裏貼一篇——直方圖均衡化

3.2 MATLAB實現

直方圖均衡化MATLAB中其實是有封裝好的函數的即histeq()函數:
在這裏插入圖片描述
另外還有一個顯示圖像直方圖分佈的函數——imhist()函數
但是在這裏爲了看一下直方圖均衡化到底是怎麼實現的,我還是自己碼一下,這樣可以瞭解一下實現過程,更熟悉掌握。

3.2.1 直方圖均值化——自己編寫代碼

直接按照均衡化的思路來碼代碼,基本是以下幾個步驟:
1.統計各像素點的灰度值
2.各灰度級的概率計算
3.累積概率分佈函數計算
4.灰度級映射
直接看代碼,我們這個是在第2部分高通增強基礎filter_image2上進行的:

%% 直方圖均衡化
%進行像素灰度統計;  
s = zeros(1,256);%統計各灰度數目,共256個灰度級  
for i = 1:len  
    for j = 1: wid
        s(filter_image2(i,j) + 1) = s( filter_image2(i,j) + 1) + 1;%對應灰度值像素點數量增加一  
    end  
end  
%計算灰度分佈密度  
p = zeros(1,256);  
for i = 1:256  
    p(i) = s(i) / (len * wid * 1.0);  
end  
%計算累計直方圖分佈  
c = zeros(1,256);  
c(1) = p(1);
for i = 2:256   
        c(i) = c(i - 1) + p(i);  
end  
%累計分佈取整,將其數值歸一化爲1~256 
c = uint8(255 .* c + 0.5);  
%對圖像進行均衡化
for i = 1:len 
    for j = 1: wid
        hist_image(i,j) = c(filter_image2(i,j)+1);  
    end  
end  

3.2.2 直方圖均衡化——MATLAB自帶函數

這就更簡單了,如下:

mat_hist_image=histeq(filter_image2,256);

3.3 處理結果

最後我們來看看自己碼的直方圖均衡化代碼和MATLAB自帶的函數處理的結果:
在這裏插入圖片描述
圖©和圖(d)分別表示兩種處理的結果,看到效果基本是一樣的,與圖(b)比較,可以發現背景變得更加清晰了,我們的目的也達到了。

#聲明

本文章的公式以及圖片來源於岡薩雷斯的《數字圖像處理 第2版》Example 4.9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章