2012-04-12 107 views
2

我真的很困惑這種技術..我知道直方圖是每個值的頻率(我正在處理灰度圖像),並且我已經生成的方法來做到這一點:點向圖像處理 - 直方圖均衡(處理)

int[] populateHist (PImage x) 
{ 
    x.loadPixels(); 
    int[] out = new int[256]; 
    for (int i = 0; i < x.pixels.length; i++) 
    { 
    out[(int)red(x.pixels[i])]++; 
    } 
    return out; 
} 

而對於累積陣列的擴展功能:

int[] spreadFunc (int[] a) 
{ 
    int[] out = new int[256]; 
    for (int i = 0; i < a.length; i++) 
    { 
    if (i == 0) 
    { 
     out[i] = (a[i]); 
    } 
    else 
    out[i] = (a[i]) + (a[i-1]); 
    } 
    return out; 
} 

下一步是歸一化這些值,以便爲它正確取最大值和除以所有值由相同的一定數量,以便最大值現在是255?

另外,我很困惑的另一件事是,即使在對直方圖進行歸一化之後,我將如何使用擴展像素值重新創建圖像?

回答

0

首先獲得CDF(累積分佈函數)。這基本上是你的「擴展函數」,但是你應該規範化它,使得它從0到1(用像素數除以2)。

其次,你重新映射像素y = cdf(x)*255

的值,或做只是y = cdf(x)和重新映射線性最小 - 最大值0-255範圍內,它基本上是同樣的事情。

參見例如http://en.wikipedia.org/wiki/Histogram_equalization#Implementation