同態濾波及其實現

2021-09-12 06:41:35 字數 3086 閱讀 4574

一、同態濾波

對於一幅由物理過程產生的影象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...

同態濾波的補充說明

之前介紹過同態濾波的計算公式 本文為一些補充說明。實際應用中,經常碰到這樣一類影象,它們的灰度動態範圍很大,即 黑的部分很黑,白的部分很白,使用者感興趣的中間一部分灰度級範圍又很小,分不清物體的灰度層次和細節。遇到這種情況,一般的灰度線性變換沒法解決問題,因為擴充套件灰度級雖然可以提高影象的反差,但...