如何平滑直方图?

时间:2009-11-25 15:46:05

标签: c++ opencv histogram smooth

我想平滑直方图。

因此,我试图平滑cvHistogram的内部矩阵。

typedef struct CvHistogram
{
    int     type;
    CvArr*  bins;
    float   thresh[CV_MAX_DIM][2]; /* for uniform histograms */
    float** thresh2; /* for non-uniform histograms */
    CvMatND mat; /* embedded matrix header for array histograms */
}

我试图像这样平滑矩阵:

cvCalcHist( planes, hist, 0, 0 ); // Compute histogram
(...)

// smooth histogram with Gaussian Filter
cvSmooth( hist->mat, hist_img, CV_GAUSSIAN, 3, 3, 0, 0 );

不幸的是,这不起作用,因为cvSmooth需要CvMat作为输入而不是CvMatND。我无法将CvMatND转换为CvMatCvMatND在我的情况下是2-dim。)

有没有人可以帮助我?感谢。

1 个答案:

答案 0 :(得分:9)

您可以使用与均值滤波器相同的基本算法,只计算平均值。

for(int i = 1; i < NBins - 1; ++i)
{
    hist[i] = (hist[i - 1] + hist[i] + hist[i + 1]) / 3;
}

您可以选择使用稍微灵活的算法,以便轻松更改窗口大小。

int winSize = 5;
int winMidSize = winSize / 2;

for(int i = winMidSize; i < NBins - winMidSize; ++i)
{
    float mean = 0;
    for(int j = i - winMidSize; j <= (i + winMidSize); ++j)
    {
         mean += hist[j];
    }

    hist[i] = mean / winSize;
}

但请记住,这只是一种简单的技术。

如果您真的想使用OpenCv工具,我建议您访问openCv论坛:http://tech.groups.yahoo.com/group/OpenCV/join