天天看點

The Gray World Assumption

Color Constancy 色彩恒常性(2)The Gray World Assumption  

着上篇往下講,與White Patch Retinex相同,Gray-World 也是恢複圖像原色的算法,兩種算法最核心的不同在于對光源強度的估計。

Gray World 算法基于一個假設The Gray World Assumption:on average, the world is gray.也就是說自然圖像的像素顔色平均值為常值1/2(在顔色範圍歸一化在[0,1]的情況下)。

下面講述該算法的具體數學推導過程。

算法:

(1)基本算法

下式是圖像成像的數學表達,具體的含義在上篇文章Color Constancy 色彩恒常性(1)White Patch Retinex中有講到,這裡就不再重複。

The Gray World Assumption

依然假設像素的色彩和像素的亮度值成比例

The Gray World Assumption

按照Gray World假設,對

The Gray World Assumption

取平均,則有

The Gray World Assumption

且 

The Gray World Assumption

式中E(R) = 1/2即是由Gray World假設得出,帶入後得到:

The Gray World Assumption

依然假設E(G)=1,那麼光源的強度可以估計為:

 

The Gray World Assumption

  (1)

最終經過色彩恢複後的圖像為:

The Gray World Assumption

(2)

(2)改進算法

上述的原始算法具有很大的局限性。若圖像的顔色比較單一,那麼就不再滿足gray world假設。為解決這個問題,提出了一些改進的算法,其中的一種主要思路是,先對圖像進行分割,然後求分割後每塊圖像的顔色均值,進而求出總的顔色均值。用數學可以表示為下式:

The Gray World Assumption

式中,nr為分割後區域的個數,a(Rj)為第j個區域的平均像素值。通過這種方法求得最終的ai帶入式(1)中。

在這種思想下,提出了一種具體的算法,該算法求三個通道的直方圖,然後将其量化為10類,那麼最終可以将256*256*256中顔色量化為10*10*10=1000種顔色,書中将這1000種類描述為1000 buckets。(直覺的了解就是把整幅圖像畫一個直方圖,該直方圖有1000個柱,也就是1000個bucket)。

最終的求ai的式子為:

The Gray World Assumption

式中,nnz為直方圖中像素點個數非0的bucket的個數,nb為bucket的總個數(按照書中的意思,nb =1000,我的了解是nb = nnz),ci(j)為第j個bucket中像素的值。

同樣的,将求得的ai帶入式(1)中,然後帶入式(2)求得恢複後的輸出。

MATLAB代碼:

代碼(其中,para=0是原始的方法,para=1是改進後的方法):

[plain]  view plain copy print ?

  1. function out = GrayWorld(in,para)%
  2. %%%% copyright: ofalling %%%%
  3. if( nargin < 2 )
  4. para = 0;
  5. end
  6. out = zeros(size(in));
  7. inDouble = double(in)/255;
  8. % % gamma correction
  9. gamma = 1/2.2;
  10. inDouble = inDouble.^(gamma);
  11. if ( para == 0)% 最原始的gray world算法
  12. for i = 1:3
  13. a(i) = mean(mean(inDouble(:,:,i)));
  14. f = 2;% f = 2/E(G),assume E(G)=1
  15. out(:,:,i) = inDouble(:,:,i)/(f*a(i));
  16. end
  17. elseif( para == 1)% 先使用直方圖分割為1000塊再計算光源強度
  18. inR = inDouble(:,:,1);
  19. inG = inDouble(:,:,2);
  20. inB = inDouble(:,:,3);
  21. nb = 0;
  22. for r = 1:10
  23. for g = 1:10
  24. for b = 1:10
  25. bucket = find((inR>0.1*(r-1))&(inR<0.1*r)&(inG>0.1*(g-1))&...
  26. (inG<0.1*g)&(inB>0.1*(b-1))&(inB<0.1*b));
  27. if (size(bucket)~=0 )
  28. nb = nb+1;
  29. bucketC(nb,:) = [0.1*r-0.05 0.1*g-0.05 0.1*b-0.05];
  30. end
  31. end
  32. end
  33. end
  34. for i =1:3
  35. a(i) = mean(bucketC(:,i));
  36. f = 2;% f = 2/E(G),assume E(G)=1
  37. out(:,:,i) = inDouble(:,:,i)/(f*a(i));
  38. end
  39. end

(1)原始算法結果

The Gray World Assumption
The Gray World Assumption

(2)改進算法結果

The Gray World Assumption
The Gray World Assumption

對比實驗(1)和(2)的結果,發現改進後的算法明顯比原始的算法效果好。且改進後的算法使用範圍更廣。