單尺度Retinex(SSR) + 代碼實現

       我看了n多關於基於單尺度Retinex圖像增強的文獻,用的高斯濾波函數都不一樣,有的直接用高斯濾波器,就是自帶的gaussian函數實現,有的是用自定義高斯函數,然而公式係數又都不一樣,我快被搞瘋了,研究了三天,終於在Matlab上實現了這個 “簡單” 的SSR,想哭???  

 


  • Retinex的理論依據

世界本是無色的,人們看到的顏色是 光和物質相互作用 的結果。

Retinex理論正印證了這一觀點,認爲物體的顏色與物體表面光照強度的絕對值,或者說反射光的絕對值關係不大,

而是由其接收到的不同波長的光線的反射能力所決定的,這是Retinex理論的核心所在。

Land提出的Retinex算法是一種建立在科學實驗和分析上的常用的空域圖像增強手段,如同Matlab是由Matrix(矩陣)和Laboratory(實驗室)兩個單詞組合而成一樣,Retinex是由Retina(視網膜)和Cortex(大腦皮層)兩者組合而成,又可以被稱爲視網膜大腦皮層理論

它建立在三個假設的基礎上:

  1. 人眼能感知的顏色實際上是光和物質相互作用的產物,而原本真實的世界是無色的。就如水本應是無色的,但我們看見水膜或肥皂膜呈現出五彩繽紛的色彩,實際上是薄膜干涉產生的。
  2. 固定波長的三原色(紅、綠、藍)構成了每一個顏色區域。
  3. 三原色決定了物體每個單位像素點的顏色。

Retinex算法的基礎理論: 人類視覺系統觀察到的物體的顏色是由物體對三種波形的反射能力決定的,分別是長波(紅色)、中波(綠色)、短波(藍色)。物體的色彩不受光照強度和光照的非均勻性所影響,具有一致性。

Retinex可以在色彩恆常性、動態範圍壓縮和邊緣增強三個方面達到平衡。

  • 色彩恆常性

所謂色彩恆常性就是人體會通過視覺系統HVS(Human cisual system)對觀察到的物體色彩變化進行處理,只保留物體內在的信息,而不會隨外界光照的變化而對物體產生不同的認知變化,大腦皮層接收到這些物體的本質信息後,經過處理形成人的視覺。

例如,用紅色光照射白色物體的表面,我們看到的不是紅色,而是在紅光照射下的白色。這就是一中色彩恆常性的表現。

由於光照環境的變化,使某一物體表面反射譜不同,人類視覺系統能夠判斷識別出該變化是否由光照環境變化產生,當光照的變化在一定範圍內時,在這一變化範圍內的人的視覺識別機制認爲物體表面顏色是恆定不變的。顏色恆常性是指人對物體顏色的知覺,與人的知識經驗、心理傾向有關,不是指物體本身顏色的恆定不變。


  • 經典的Retinex圖像增強算法

在Retinex模型中,圖像I(x,y)被分爲兩部分,一部分是反射分量R(x,y),代表物體的本質信息,另一部分是入射分量L(x,y),表示的是入射光亮,即亮度圖像,模型如下:

Retinex理論認爲,圖像可以由反射圖像和亮度圖像的乘積構成:

Retinex的核心就是要獲得表現本質信息的反射圖像。通過分離入射圖像,就有可能減弱因光照因素產生的對圖像的影響,可以增強圖像的細節信息,獲得代表圖像本質信息的內容。

通常Retinex算法是把上述乘法式轉換到對數域,即把乘法轉換至加法:log I = log (R x L) = log R + log L。

我們需要對多種Retinex算法中具有代表性的三種算法進行分析與掌握:

  • 單尺度Retinex算法(Single-Scale Retinex,SSR)
  • 多尺度Retinex算法(Multi-Scale Retinex,MSR)
  • 帶色彩恢復的多尺度Retinex算法(The Color Restoration Step of Multiscale Retinex,MSMCR)

  • 單尺度Retinex算法

求入射圖像在數學上是一個奇異問題,而在單尺度Retinex算法中,Jobson等人發現用高斯函數與圖像進行卷積能夠近似的表現入射分量: 

SSR的實現過程:

  因爲 I=RxL  所以 R=I/L , 即 log R = log I - log L。

·········>

本質是一個低通濾波器,K是歸一化常數,使成立。

c表示高斯核,決定了G的鄰域大小,可以控制圖像細節和色彩的保留情況。

c較小時,原圖像局部細節較爲突出,但會出現顏色失真;

c較大時,G的鄰域範圍就大,顏色較自然,但以某一像素點爲中心的周圍其他像素對這個像素點的影響就越小,這樣就會導致對圖像的細節信息保留較少,圖像的對比度信息不強。相關實驗表明,c的取值一般在80-100的範圍內。

SSR算法的具體實現步驟:

1.讀取原始待增強圖像 I(x,y),並進行數據類型變換,將整型變換爲double型;

2.確定參數c的大小,並根據公式確定係數K的取值;

3.根據公式來獲得圖像R(x,y);

4.對R(x,y)進行線性校正處理(因爲R(x,y)的範圍不在0-255內),校正後的圖像即爲算法增強圖像。

注意:對灰度圖像進行處理時,按上述步驟即可,但彩色圖像進行增強時,需要把彩色圖像分爲R、G、B三個分量分別按以上步驟進行處理,然後再合成獲得增強圖像。

 

Matlab代碼實現:

I=imread('test.jpg');

Ir=I(:,:,1);%提取紅色分量
Ig=I(:,:,2);%提取綠色分量
Ib=I(:,:,3);%提取藍色分量
I1=SSR(Ir); %自定義單尺度Retinex處理函數
I2=SSR(Ig);
I3=SSR(Ib);
In=cat(3,I1,I2,I3);          %cat用於構造多維數組
subplot(1,2,1);imshow(I);
title('A). 原始圖像');  
subplot(1,2,2);imshow(In,[]);
title('B). 單尺度Retinex');

%——————————————劃重點!!!!!!!!!!!!!!!!!!!!————————————————

function A = SSR(I)
G=I;
[m,n]=size(I);
I=double(I);
x0=floor((m+1)/2);y0=floor((n+1)/2);
c = 80;
K=1/(sqrt(2*pi)*c);
for x=1:m
    for y=1:n
            G(x,y)=K*(exp(-((x-x0)^2+(y-y0)^2)/(2*c^2))); %高斯函數
    end
end

Gfft=fft2(G);
Ifft=fft2(I);
Lfft=Gfft.*Ifft;
L=ifft2(Lfft);

r=log(I+1)-log(L+1);                   %加1是爲了防止對數爲0時,log0沒有定義

%線性拉伸,將灰度範圍轉換到0-255,(直接求反對數的效果不好)
MIN=min(min(r));
MAX=max(max(r));
new=(r-MIN)*255/(MAX-MIN);
A=new;
end

 看一下處理效果:

 

 

 

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