同态滤波及其实现
一、同態(tài)濾波
對于一幅由物理過程產(chǎn)生的圖像f(x,y),可以表示為照射分量i(x,y)和反射分量r(x,y)的乘積。0<i(x,y)<∞,0<r(x,y)<1。i(x,y)描述景物的照明,變化緩慢,處于低頻成分。r(x,y)描述景物的細節(jié),變化較快,處于高頻成分。
因為該性質(zhì)是乘性的,所以不能直接使用傅里葉變換對i(x,y)和r(x,y)進行控制,因此可以先對f(x,y)取對數(shù),分離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],為了避免出現(xiàn)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) )。
最后,反對數(shù)(取指數(shù)),得到最后處理后的圖像。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)
由于我們會得到動態(tài)范圍很大,但我們感興趣的部分很暗,無法辨認細節(jié)的圖像。這可以認為或者實際上就是由于光照不均所造成的。為了減少光照的影響,增強圖像的高頻部分的細節(jié),我們可以使用同態(tài)濾波來增強對比度,增強細節(jié)。
在此情況下,我們可以通過衰減低頻成分,增強高頻成分來達到我們的目的。通常可以采用如下高斯高通濾波器的變形濾波來對圖像進行處理。
其中,選擇rh > 1, rl < 1可以達到衰減低頻,增強高頻的目的,常數(shù)c控制函數(shù)坡度的銳利度。D(u,v)和D0與我們之前說低通濾波的時候意義一樣。分別表示和頻率中心的距離和截止頻率。D0越大,對細節(jié)的增強越明顯,最后歸一化之后顯示的圖像越亮。對于不同的圖像,D0的取值差別很大。對于特定的D0,有的圖像顯示之后是黑乎乎的一片,而有的圖像卻是整體白亮。
三、代碼實現(xiàn)
在使用matlab代碼使用如上所說的濾波器H(u,v)進行同態(tài)濾波的時候,基本過程和我們之前介紹進行低通濾波器的時候,進行頻率域濾波的過程基本一致。理想低通濾波器、Butterworth濾波器和高斯濾波器(matlab)
只不過,在填充圖像之前,先對圖像進行對數(shù)化。在最后提取左上角的部分之后,對圖像進行反對數(shù)化(取指數(shù)),然后再歸一化,得到最終的圖像。
1. 同態(tài)濾波函數(shù)代碼如下:
該函數(shù)為HomoFilter,輸入為需要進行同態(tài)濾波的灰度圖像(灰度級L = 256),同態(tài)濾波器的參數(shù)rh,rl,c和D0。輸出為濾波后的圖像(已經(jīng)歸一化到[0, L-1])。
function [image_out] = HomoFilter(image_in, rh, rl, c, D0) % 同態(tài)濾波器 % 輸入為需要進行濾波的灰度圖像,同態(tài)濾波器的參數(shù)rh, rl,c, D0 % 輸出為進行濾波之后的灰度圖像[m, n] = size(image_in); P = 2*m; Q = 2*n;% 取對數(shù) image1 = log(double(image_in) + 1);fp = zeros(P, Q); %對圖像填充0,并且乘以(-1)^(x+y) 以移到變換中心 for i = 1 : mfor j = 1 : nfp(i, j) = double(image1(i, j)) * (-1)^(i+j);end end % 對填充后的圖像進行傅里葉變換 F1 = fft2(fp);% 生成同態(tài)濾波函數(shù),中心在(m+1,n+1) Homo = zeros(P, Q); a = D0^2; % 計算一些不變的中間參數(shù) r = rh-rl; for u = 1 : Pfor v = 1 : Qtemp = (u-(m+1.0))^2 + (v-(n+1.0))^2;Homo(u, v) = r * (1-exp((-c)*(temp/a))) + rl;end end%進行濾波 G = F1 .* Homo;% 反傅里葉變換 gp = ifft2(G);% 處理得到的圖像 image_out = zeros(m, n, 'uint8'); gp = real(gp); g = zeros(m, n); for i = 1 : mfor j = 1 : ng(i, j) = gp(i, j) * (-1)^(i+j);end end % 指數(shù)處理 ge = exp(g)-1; % 歸一化到[0, L-1] mmax = max(ge(:)); mmin = min(ge(:)); range = mmax-mmin; for i = 1 : mfor j = 1 : nimage_out(i,j) = uint8(255 * (ge(i, j)-mmin) / range);end endend2. 測試代碼如下:
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. 結(jié)果如下:
可以看到,經(jīng)過同態(tài)濾波之后的圖像,圖像可以看到更多的細節(jié),降低了照射分量的影響。
下面是對另一幅圖像的同態(tài)濾波結(jié)果,可以看到,對于D0與上面一樣,都為80的情況下,圖片一片黑乎乎。當(dāng)D0等于500的時候,可以看到很多的細節(jié)。說明了對于不同的圖像,D0的差別可能很大。
總結(jié)
- 上一篇: 64 位 win7(2008 r2) 使
- 下一篇: 求二维数组的转置矩阵