2010-07-02 71 views
2

我有一個可能很簡單的問題,但我仍然不確定!直方圖平滑

其實我只想平滑一個直方圖,我不確定以下哪個方法是正確的。我會做這樣的:

vector<double> mask(3); 
mask[0] = 0.25; mask[1] = 0.5; mask[2] = 0.25; 

vector<double> tmpVect(histogram->size()); 
for (unsigned int i = 0; i < histogram->size(); i++) 
    tmpVect[i] = (*histogram)[i]; 

for (int bin = 1; bin < histogram->size()-1; bin++) { 
    double smoothedValue = 0; 
    for (int i = 0; i < mask.size(); i++) { 
    smoothedValue += tmpVect[bin-1+i]*mask[i]; 
    } 
    (*histogram)[bin] = smoothedValue; 
} 

或者你平時做這樣的?:

vector<double> mask(3); 
mask[0] = 0.25; mask[1] = 0.5; mask[2] = 0.25; 

for (int bin = 1; bin < histogram->size()-1; bin++) { 
    double smoothedValue = 0; 
    for (int i = 0; i < mask.size(); i++) { 
    smoothedValue += (*histogram)[bin-1+i]*mask[i]; 
    } 
    (*histogram)[bin] = smoothedValue; 
} 

我Questin是:是否有合理的直方圖在額外的載體先複製,這樣,當我平滑在bin i我可以使用原始的i-1值,或者我會簡單地做smoothedValue += (*histogram)[bin-1+i]*mask[i];,以便我使用已經平滑的i-1值代替原來的值。

Regards &感謝您的回覆。

+0

歡迎來到SO!下一次,請使用四個空格縮進代碼來格式化您的代碼,或者選擇它並單擊101010按鈕。我這次爲你做了。您可以使用反引號(\'\')來格式化文本段落中的代碼。 – Thomas 2010-07-02 11:04:59

回答

2

你的直覺是對的:你需要一個臨時向量。否則,您將最終使用部分舊值和部分新值,結果將不正確。用一個簡單的例子在紙上試一試。

有兩種方法,你可以寫這個算法:

  1. 的數據複製到一個臨時矢量第一;然後從那裏讀取,並寫入histogram。這就是你在第一個代碼片段中所做的。
  2. histogram中讀取並寫入臨時向量;然後從臨時向量複製回histogram

爲防止不必要的數據複製,您可以使用vector::swap。這是一個非常快速的操作,可以交換兩個向量的內容。使用上面的策略2,這將導致:

vector<double> mask(3); 
mask[0] = 0.25; mask[1] = 0.5; mask[2] = 0.25; 

vector<double> newHistogram(histogram->size()); 

for (int bin = 1; bin < histogram->size()-1; bin++) { 
    double smoothedValue = 0; 
    for (int i = 0; i < mask.size(); i++) { 
    smoothedValue += (*histogram)[bin-1+i]*mask[i]; 
    } 
    newHistogram[bin] = smoothedValue; 
} 

histogram->swap(newHistogram);