光照不均勻圖像分割---同態濾波

本文轉自 執劍者羅輯 的CSDN博客
原文:https://blog.csdn.net/cjsh_123456/article/details/79351654
 

一、同態濾波對於一幅由物理過程產生的圖像f(x,y),可以表示爲照射分量i(x,y)和反射分量r(x,y)的乘積。0<i(x,y)<∞,0<r(x,y)<1。i(x,y)描述景物的照明,變化緩慢,處於低頻成分。r(x,y)描述景物的細節,變化較快,處於高頻成分。

因爲該性質是乘性的,所以不能直接使用傅里葉變換對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);
    end
end
% 對填充後的圖像進行傅里葉變換
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;
    end
end

%進行濾波
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);
       
    end
end
% 指數處理
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);
    end
end

end
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的差別可能很大。


 

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