直方图平滑

时间:2010-07-02 11:01:08

标签: histogram smooth

我有一个非常简单的问题,但我仍然不确定!

实际上我只想平滑直方图,我不确定以下哪种方法是正确的。我会这样做吗:

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值,或者我只是{{1}因此,我使用已经平滑的smoothedValue += (*histogram)[bin-1+i]*mask[i];值而不是原始值。

问候&amp;谢谢你的回复。

1 个答案:

答案 0 :(得分:2)

你的直觉是对的:你需要一个临时的向量。否则,您将最终使用部分旧值和部分新值,结果将不正确。用一个简单的例子自己在纸上试一试。

有两种方法可以编写此算法:

  1. 首先将数据复制到临时矢量;然后从那个读取,并写入histogram。这就是你在第一个代码片段中所做的。
  2. histogram读取并写入临时向量;然后从临时矢量复制回histogram
  3. 为防止不必要的数据复制,您可以使用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);