一、同態濾波
對於一幅由物理過程產生的影象f(x,y),可以表示為照射分量i(x,y)和反射分量r(x,y)的乘積。0因為該性質是乘性的,所以不能直接使用傅利葉變換對i(x,y)和r(x,y)進行控制,因此可以先對f(x,y)取對數,分離i(x,y)和r(x,y)。令z(x,y) = ln f(x,y) = ln i(x,y) + ln r(x,y)。在這個過程中,由於f(x,y)的取值範圍為[0, l-1],為了避免出現ln(0)的情況,故採用ln ( f(x,y) + 1 ) 來計算。
然後取傅利葉變換,得到 z(u,v) = fi(u,v) + fr(u,v)。
然後使用乙個濾波器,對z(u,v)進行濾波,有 s(u,v) = h(u,v) z(u,v) = h(u,v)fi(u,v) + h(u,v)fr(u,v)。
濾波後,進行反傅利葉變換,有 s(x, y) = idft( s(u,v) )。
最後,反對數(取指數),得到最後處理後的影象。g(x,y) = exp^(s(x,y)) = i0(x,y)+r0(x,y)。由於我們之前使用ln ( f(x,y)+1),因此此處使用exp^(s(x,y)) - 1。 i0(x,y)和r0(x,y)分別是處理後影象的照射分量和入射分量。
二、濾波器h(u,v)
由於我們會得到動態範圍很大,但我們感興趣的部分很暗,無法辨認細節的影象。這可以認為或者實際上就是由於光照不均所造成的。為了減少光照的影響,增強影象的高頻部分的細節,我們可以使用同態濾波來增強對比度,增強細節。
在此情況下,我們可以通過衰減低頻成分,增強高頻成分來達到我們的目的。通常可以採用如下高斯高通濾波器的變形濾波來對影象進行處理。
其中,選擇rh > 1, rl < 1可以達到衰減低頻,增強高頻的目的,常數c控制函式坡度的銳利度。d(u,v)和d0與我們之前說低通濾波的時候意義一樣。分別表示和頻率中心的距離和截止頻率。d0越大,對細節的增強越明顯,最後歸一化之後顯示的影象越亮。對於不同的影象,d0的取值差別很大。對於特定的d0,有的影象顯示之後是黑乎乎的一片,而有的影象卻是整體白亮。
三、**實現
在使用matlab**使用如上所說的濾波器h(u,v)進行同態濾波的時候,基本過程和我們之前介紹進行低通濾波器的時候,進行頻率域濾波的過程基本一致。理想低通濾波器、butterworth濾波器和高斯濾波器(matlab)
只不過,在填充影象之前,先對影象進行對數化。在最後提取左上角的部分之後,對影象進行反對數化(取指數),然後再歸一化,得到最終的影象。
1. 同態濾波函式**如下:
該函式為homofilter,輸入為需要進行同態濾波的灰度影象(灰度級l = 256),同態濾波器的引數rh,rl,c和d0。輸出為濾波後的影象(已經歸一化到[0, l-1])。
function [image_out] = homofilter(image_in, rh, rl, c, d0)% 同態濾波器
% 輸入為需要進行濾波的灰度影象,同態濾波器的引數rh, rl,c, d0
% 輸出為進行濾波之後的灰度影象
[m, n] = size(image_in);
p = 2*m;
q = 2*n;
% 取對數
image1 = log(double(image_in) + 1);
fp = zeros(p, q);
%對影象填充0,並且乘以(-1)^(x+y) 以移到變換中心
for i = 1 : m
for j = 1 : n
fp(i, j) = double(image1(i, j)) * (-1)^(i+j);
endend% 對填充後的影象進行傅利葉變換
f1 = fft2(fp);
% 生成同態濾波函式,中心在(m+1,n+1)
homo = zeros(p, q);
a = d0^2; % 計算一些不變的中間引數
r = rh-rl;
for u = 1 : p
for v = 1 : q
temp = (u-(m+1.0))^2 + (v-(n+1.0))^2;
homo(u, v) = r * (1-exp((-c)*(temp/a))) + rl;
endend%進行濾波
g = f1 .* homo;
% 反傅利葉變換
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);
endend% 指數處理
ge = exp(g)-1;
% 歸一化到[0, l-1]
mmax = max(ge(:));
mmin = min(ge(:));
range = mmax-mmin;
for i = 1 : m
for j = 1 : n
image_out(i,j) = uint8(255 * (ge(i, j)-mmin) / range);
endendend
---------------------
原文:
2. 測試**如下:
clear all;
close all;
clc;
image1 = imread('10.bmp');
[m, n] = size(image1);
image2 = homofilter(image1, 2, 0.25, 1, 80);
% 顯示影象
subplot(1,2,1), imshow(image1), title('原影象');
subplot(1,2,2), imshow(image2), title('d0 = 80');
3. 結果如下:
可以看到,經過同態濾波之後的影象,影象可以看到更多的細節,降低了照射分量的影響。
下面是對另一幅影象的同態濾波結果,可以看到,對於d0與上面一樣,都為80的情況下,一片黑乎乎。當d0等於500的時候,可以看到很多的細節。說明了對於不同的影象,d0的差別可能很大。
高斯濾波及其實現
1.濾波演算法簡介 影象處理中,常用的濾波演算法有均值濾波 中值濾波以及高斯濾波等。均值濾波使用模板內所有畫素的平均值代替模板中心畫素灰度值,這種方法易收到雜訊的干擾,不能完全消除雜訊,只能相對減弱雜訊 中值濾波計算模板內所有畫素中的中值,並用所計算出來的中值體改模板中心畫素的灰度值,這種方法對雜訊...
matlab實現同態濾波
同態濾波的原理框圖 matlab clear,clc img imread tape.png l size img 計算影象大小 if numel l 2 判斷影象是否是彩色影象 gray rgb2gray img 影象灰度變換 else gray img endgray double gray m...
同態濾波的補充說明
之前介紹過同態濾波的計算公式 本文為一些補充說明。實際應用中,經常碰到這樣一類影象,它們的灰度動態範圍很大,即 黑的部分很黑,白的部分很白,使用者感興趣的中間一部分灰度級範圍又很小,分不清物體的灰度層次和細節。遇到這種情況,一般的灰度線性變換沒法解決問題,因為擴充套件灰度級雖然可以提高影象的反差,但...