2016-04-21 97 views
1

我想要做的是写一个函数,计算一个灰度图像的直方图与直方图范围划分的转发数量的分区(anzBin)。然后,我通过图像像素的价值compairing不同的垃圾箱,并在时的值适合在运行,1试图计算我自己的直方图没有opencv calcHist()

vector<int> calcuHisto(const IplImage *src_pic, int anzBin) 
    { 
    CvSize size = cvGetSize(src_pic); 
    int binSize = (size.width/256)*anzBin; 
    vector<int> histogram(anzBin,0); 

    for (int y = 0; y<size.height; y++) 
    { 
     const uchar *src_pic_point = 
     (uchar *)(src_pic->imageData + y*src_pic->widthStep); 
     for (int x = 0; x<size.width; x++) 
     { 
     for (int z = 0; z < anzBin; z++) 
     { 
      if (src_pic_point[x] <= z*binSize) 
      { 
       histogram[src_pic_point[x]]++; 
      } 

     } 

    } 
} 
return histogram; 
} 

增加斌的价值,但遗憾的是它不工作... 什么是错的这里? 请帮助

+0

'int binSize =(size.width/256)* anzBin;'因为整数数学,'binSize' 0在这里吗?我的意思是如果size.width小于256不会'binSize'为0? – drescherjm

+0

这不是我想要计算的东西,你是对的。我的目标是这样的:binSize =(图像()/ 256)* anzBin但我该怎么做? – AloisD

+0

替换256与256.0 – drescherjm

回答

3

有几个问题,我可以看到

  1. 你binSize计算是错误的
  2. 你合并算法是一个片面的,而且应该是双面
  3. 你是不是递增当你找到一个匹配合适的箱子

1 binsize计算

bin size = your range/number of bins

2.双面合并

if (src_pic_point[x] <= z*binSize) 

需要一种双面范围的值,而不是一个一个片面不等式。想象一下,你有4个箱和值从0到255你箱应具有以下范围

bin  low  high 
0  0  63.75 
1  63.75 127.5 
2  127.5 191.25 
3  191.25 255 

比如:57值应斌0去你的代码表示数值超出所有的垃圾箱!因为它始终是<= z*binsize你需要一些具有较低和较高界限的东西。

3递增相应的分档

您正在使用z遍历每个仓,所以当你找到一个匹配你应该增加斌z,您不使用确定时除外实际像素值它属于哪个bin

这可能是缓冲区溢出想象你再有4个bin,当前像素的值为57.此代码表示增加bin 57.但你只有4个bin(0-3)

histogram[src_pic_point[x]]++; 

你只想增加像素值落在仓进入

histogram[z]++; 

CODE
考虑到这一点这里是修改后的代码(这是未经测试,但应工作)

vector<int> calcuHisto(const IplImage *src_pic, int anzBin) 
{ 
    CvSize size = cvGetSize(src_pic); 
    double binSize = 256.0/anzBin;  //new definition 
    vector<int> histogram(anzBin,0);  //i don't know if this works so I 
              //so I will leave it 

    //goes through all rows 
    for (int y = 0; y<size.height; y++) 
    { 
     //grabs an entire row of the imageData 
     const uchar *src_pic_point = (uchar *)(src_pic->imageData + y*src_pic->widthStep); 

     //goes through each column 
     for (int x = 0; x<size.width; x++) 
     { 
      //for each bin 
      for (int z = 0; z < anzBin; z++) 
      { 
       //check both upper and lower limits 
       if (src_pic_point[x] >= z*binSize && src_pic_point[x] < (z+1)*binSize) 
       { 
        //increment the index that contains the point 
        histogram[z]++; 
       } 
      } 
     } 
    } 
    return histogram; 
} 
+1

好吧我刚刚检查过它和它的作品!非常感谢!!!这正是我所期待的。祝你今天愉快! – AloisD