2010-07-02 70 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);