2015-12-16 64 views
1

我正在爲灰度圖像寫入我自己的強度直方圖,其中箱的數量傳遞到函數中。 這是我到目前爲止有:強度直方圖++

std::vector<unsigned int> Image::histogram(const int bins) 
{ 
std::vector<unsigned int> histogram(bins ,0); 
for (unsigned int i(0); i < bins; i++) 
{ 
    for (unsigned int j(0); j < m_height * m_width; ++j) 
    { 
     if (i == m_p_image[j]) 
     { 
      histogram[i]++; 
     } 
    } 
} 
return histogram; 
} 

爲每項罪名加到直方圖這完全適用於256個箱,但對128進行裝倉它忽略了圖像的下半年,我知道我需要實現一個如果bin大小小於256,但是我不確定如何執行此操作,將點組合在一起的方法。

回答

1

你的代碼讓我覺得不必要的笨拙。沒有真正的需要外部循環。

但是,要回答您提出的問題,常用的方法是使用線性插值 - 即在輸入範圍內找到一個值的比例位置,然後在輸出範圍。

for (j =0; j<height * width; j++) { 
    double input_pos = image[j]/256.0; 
    int output_pos = int(input_pos * bin_count); 
    ++histogram[output_pos]; 
} 

鑑於這些顏色,你可能(如果您選擇)應用伽瑪曲線,而不是做線性插值。這樣做的理由是,如果你想模擬你看到顏色的方式,而不是直接在輸入數字本身上建立直方圖。兩者之間的差異是基於這樣一個事實,即視覺像對數而不是線性,所以線性直方圖(特別是如果您使用相對較少的箱子與可能的輸入值的數量相比)並不代表我們所看到的非常準確。