4

我想平滑直方图。

因此,我试图平滑 的内部矩阵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需要 aCvMat作为输入而不是 a CvMatND。我无法转换CvMatNDCvMatCvMatND在我的情况下是 2-dim)。

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

4

2 回答 2

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

于 2009-11-25T17:25:55.117 回答
0

您可以通过更改使用的 bin 数量来显着改变直方图的“平滑度”。如果您有 n 个数据点,则一个好的经验法则是拥有 sqrt(n) 个 bin。您可以尝试将此启发式应用于您的直方图,看看是否能得到更好的结果。

于 2012-09-15T08:43:52.860 回答