2016-04-21 95 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