MATLAB圖像處理--同態濾波(代碼及示例)

在這裏插入圖片描述
一幅圖像f(x,y)能夠用它的入射光分量和反射光分量來表示,其關係式如下
f(x,y)=i(x,y)r(x,y)
圖像f(x,y)是由光源產生的照度場i(x,y)和目標的反射係數場r(x,y)的共同作用下產生的。

該模型可作爲頻率域中同時壓縮圖像的亮度範圍和增強圖像的對比度的基礎。
但在頻率域中不能直接對照度場和反射係數場頻率分量分別進行獨立的操作。  
  
如果定義:
在這裏插入圖片描述

則有:
在這裏插入圖片描述

或者
在這裏插入圖片描述

這裏I(u,v)以及R(u,v)分別是lni(x,y)和 lnr(x,y)的傅里葉變換。
同態濾波方法就是利用上式的形式將圖像中的照明分量和反射分量分開。這樣同態濾波函數就可以分別作用在這兩個分量上。

圖像中的照明分量往往具有變化緩慢的特徵,而反射分量則傾向於劇烈變化,特別在不同物體的交界處。由於這種持徵,圖像的自然對數的傅里葉變換的低頻分量與照明分量相聯繫,而其高頻分量則與反射分量相聯繫。

同態濾波處理過程如下所示:
在這裏插入圖片描述

同態濾波的流程圖
在這裏插入圖片描述
同態濾波有幾個參數:
rH
rL
c %介於rH和rL之間
D0
通過調整這幾個參數達到不同的效果:
在這裏插入圖片描述
代碼示例:

%參數聲明
rH = 1;
rL = 0.1;
c = 0.2;%介於rH和rL之間
D0 = 0.2;

image = imread('path');
[M, N] = size(image);
%取對數
img_log = log(double(image) + 1);

%平移到中心,判斷語句代替指數計算
img_py = zeros(M, N);
for i = 1:M
   for j= 1:N
       if mod(i+j, 2) == 0
           img_py(i,j) = img_log(i, j);
       else
           img_py(i,j) = -1 * img_log(i, j);
       end
   end
end

% 對填充後的圖像進行傅里葉變換
img_py_fft = fft2(img_py);

%同態濾波函數
img_tt = zeros(M, N);
deta_r = rH - rL;
D = D0^2;
m_mid=floor(M/2);%中心點座標
n_mid=floor(N/2);  

for i = 1:M
   for j =1:N
        dis = ((i-m_mid)^2+(j-n_mid)^2);
        img_tt(i, j) = deta_r * (1-exp((-c)*(dis/D))) + rL;
   end
end

%濾波
img_temp =   img_py_fft.*img_tt;

%反變換,取實部,絕對值
img_temp = abs(real(ifft2(img_temp)));

%指數化
img_temp = exp(img_temp) - 1;


%歸一化處理
max_num = max(img_temp(:));
min_num = min(img_temp(:));
range = max_num - min_num;
img_after = zeros(M,N,'uint8');
for i = 1 : M
    for j = 1 : N
        img_after(i,j) = uint8(255 * (img_temp(i, j)-min_num) / range);
    end
end

subplot(1,2,1), imshow(image), title('原圖像');
subplot(1,2,2), imshow(img_after), title('變換後');



效果如下:
效果圖
可以看出相比於其他的圖像增強的方法,同態濾波效果挺好的。

最後附上常用的二維離散傅里葉變換的Matlab實現

函數fft2 — 快速傅里葉變換
格式1:F = fft2(f)
格式2:F = fft2(f, P, Q)
函數ifft2 —快速傅里葉逆變換
格式: f = ifft2(F)
函數fftshift — 將變換的原點移動到頻率矩形中心
格式:Fc =fftshift(F)
函數ifftshift — fftshift
函數的逆操作
格式:F = ifftshift(Fc)

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