天天看點

深入探究Retinex

深入探究Retinex

    • 導讀
    • Retinex
      • 動态範圍增強
      • Retinex核心理論
    • 帶色彩恢複的Retinex->MSRCR

導讀

  Retinex理論是建立在人對顔色感覺的恒常性上,真實物體都是無色的,所有顔色的産生都是光和物體互相作用,再被人眼感覺的過程。在這樣的理論基礎下,Retinex模仿人類視覺系統,衍生出了很多簡單實用的算法。Retinex相關算法,兼顧了動态範圍增強,細節增強,顔色恒常性等方面。我自己在看這些算法的時候,其實遇到了不少問題,特此記錄。

  本文不再叙述算法模型,而從上面提到的幾個方面出發,從最基礎的圖像處理知識入手,結合自己的了解,深入探究Retinex算法。如對Retinex還不太了解,可以先去自行搜尋相關部落格等。

Retinex

  Retinex算法在色偏、低照度、霧圖等成像環境惡劣的情況下有顯著效果,是以着重于這幾個點對Retinex算法進行分解,從個人了解的角度詳解算法中的每個步驟。

  首先回顧一下單尺度Retinex(Single Scale Retinex)算法架構,對輸入圖像 I I I,若是多通道就分通道處理:

  • 将 I I I變換到log域,得到 I l o g I_{log} Ilog​。
  • 用尺度為 α \alpha α的高斯核對 I I I卷積來估計光照 G G G,并變換到log域,得到 G l o g G_{log} Glog​。
  • 在log域相減,得到 R l o g = I l o g − G l o g R_{log}=I_{log}-G_{log} Rlog​=Ilog​−Glog​。
  • 從log域還原。
  • 線性拉伸。

動态範圍增強

  Retinex算法能處理低照度圖像,主要依賴于log變換。log變換作為一個非線性變換,很适合用來處理較暗的圖像,它能大幅拉伸暗的部分。但是在處理有暗有亮的圖像時候,會犧牲一部分亮處的動态範圍。是以一般在用Retinex算法時,不再從log域還原,即上述劃去的第四步。我們将上述算法中的第一步和最後一步拿出來,隻做一個log變換和Retinex算法作一個對比,如下圖所示,從左到右依次是原圖、SSR、簡單log拉伸。

深入探究Retinex

  可以看見,log函數基本承擔了低照度圖像增強的部分。以上圖為例,在SSR算法上修改,去除第一步,去除第二步的log變換,将第三步在log域相減,改為 I . / G I./G I./G原圖和估計出來的光照直接點除。得到如下效果,以下分别為原圖和處理後的圖。

深入探究Retinex

  可以确認在沒有log的處理下,Retinex算法是處理不了低照度圖像的。但是log函數可以提高亮度,但是解決不了非正常照度的影響,而這部分也是Retinex理論最核心的思想。如下圖,分别是原圖、SSR、簡單log拉伸。

深入探究Retinex

Retinex核心理論

  對于上圖這種嚴重色偏的圖像,首先從圖像本身開始探究,下面是将RGB三通道單獨拿出來作為灰階顯示。顯而易見的是,綠色通道的強度明顯大于紅通道和藍通道。知道了原因,想要恢複色偏,隻要将三個通道統一成接近的灰階級别就可以了。經典的白平衡算法如灰階世界算法等就是在同一個标準下對三個通道作對比度拉伸來解決問題。

深入探究Retinex

  而Retinex理論從光照角度出發,去除光照影響,還原物體本身的反射屬性。對一幅已獲得的圖像 I I I,假設存在這樣一個模型 I = R • G I=R•G I=R•G,其中R是物體的反射屬性,G則是光照。在這樣的假設下,要得到R,算法主要部分就是如何估計G,其中最主要的一種方法就是進行高斯濾波。原文中用的是卷積,但是高斯核本身是各向同性的,是以濾波和卷積的效果是一緻的。是以在算法處理的時候,可以在空域進行濾波,也可以轉化到頻域相乘。

  至于為什麼高斯濾波能代替光照?又如何選擇濾波參數?以下主要是一些個人了解。

  依舊是上面三通道的灰階圖,對它們進行高斯濾波來感受一下所謂的光照到底是什麼。以下3列分别是sigma為10,80,250的濾波結果。

深入探究Retinex
深入探究Retinex
深入探究Retinex

  随着sigma增大,高斯曲線不斷變得平坦,濾波結果也越來越接近均值濾波,當sigma足夠大的時候,高斯濾波也就退化成均值濾波,光照就成了整個灰階圖所有點的均值。根據上述的光照模型, R = I / G R=I/G R=I/G,這樣綠通道将除以一個比較大的光照,對每一個通道消除光照影響,進而獲得沒有色偏的圖像。同理,對于霧圖,霧的存在導緻光線的透射率下降,可以認為這是一種異常的光照,經過Retinex以後同樣可以很大程度上消除霧的影響。

  對應上面的不同sigma下的光照估計,根據 R = I / G R=I/G R=I/G,并線性拉伸到[0-1]範圍,顯示去除光照後每個通道的效果。

深入探究Retinex
深入探究Retinex
深入探究Retinex

  可見,現在每個通道的亮度等級都接近了,是以消除了嚴重的色偏問題,以下是3個尺度下的彩色結果。

深入探究Retinex

  可以明顯地看到不同sigma帶來的影響。在sigma較小的時候,估計出來的光照局部性越強,導緻平滑區域的資訊大部分丢失,隻留下了邊緣資訊。至于為什麼會這樣,可以考慮極端情況,直接将原圖作為光照相除,那樣的話每一個點都有自己的光照,去除光照後隻剩一片白色。但是顯然,光照實際上是具有連續性的,至少在某個鄰域内的光照是一緻的,是以,既要考慮光照的空間連續性和空間變化性,sigma為80左右的高斯濾波結果顯然優于其餘兩個。

  是以,較小的sigma強調圖像的邊緣資訊,較大的sigma可以更好的保留圖像的整體顔色。

  至于高斯核,在sigma确定的情況下,濾波器尺寸可以選擇 6 σ ∗ 6 σ 6\sigma*6\sigma 6σ∗6σ,對于高斯曲線來說,以 3 σ 3\sigma 3σ為半徑的自變量區域基本涵蓋了高斯函數的值域。

  至此,單尺度Retinex算法的幾個問題都已提及,多尺度的Retinex就是對上面多個尺度下得到的結果取平均就行。下面給出單尺度Retinex算法的matlab測試代碼。

clc
clear

filename = '檔案名';
I = double(imread(filename));
out = SSR(I,80);

imshow([I out])

% ---------------Single Scale Retinex-----------------
function out = SSR(im, sigma)
%Single Scale Retinex
%分通道處理

if ~exist('sigma', 'var')
     sigma = 80;
end

hsize = floor(sigma*3)*2+1;%确定高斯核尺寸
out = zeros(size(im));

k = fspecial('gaussian', hsize, sigma);%生成高斯核
G = imfilter(im, k, 'replicate');%高斯濾波

%分通道處理
for i=1:size(im, 3)
	 L = G(:,:,i);
     R = log(im(:,:,i)+1)-log(L+1);% +1控制像素值>1
     Max = max(R(:));
     Min = min(R(:));
	 out(:,:,i) = (R-Min)/(Max-Min);
end
end
           

帶色彩恢複的Retinex->MSRCR

​ 無論是單尺度還是多尺度的Retinex算法,由于都是分通道單獨進行,是以沒有考慮到不同顔色通道之間的關系,導緻有些圖像處理完後發生色偏,失真等現象。

繼續閱讀