天天看點

matlab 同态濾波

文章目錄

處理圖檔:

matlab 同态濾波

代碼:

clear all
clc
%參數聲明
rH = 1;
rL = 0.1;
c = 0.2;%介于rH和rL之間
D0 = 0.2;

image = imread('3.bmp');
[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
figure
imshow(image), title('原圖像');
figure
imshow(img_after), title('變換後');
imwrite(img_after,'同态濾波.png');
      

運作:

matlab 同态濾波

繼續閱讀