2009-11-25 135 views
3

我想平滑直方图。如何平滑直方图?

因此我试图平滑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转换为CvMat(在我的情况下,CvMatND是2-dim)。

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

+1

什么是CvMatND,CvMat?为什么cvSmoot需要CvMat?更换cvSmooth。 – 2009-11-25 17:26:47

回答

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

+0

非常感谢。 你的建议给了我更多的想法,如何处理这个问题。 谢谢! – Michelle 2009-11-27 08:35:32

+0

不客气,只是为了帮助我提高自己的分数,你能否在这个答案中投票:-) – Andres 2009-11-27 10:14:53

0

可以大大改变你使用槽的数量改变直方图的“平滑度”。一个好的经验法则是,如果你有n个数据点,就有sqrt(n)个分箱。您可以尝试将此启发式应用于您的直方图,并查看您是否获得了更好的结果。

+0

有趣。这个经验法则有一些数学基础吗? – 2014-11-24 09:11:31