2012-05-30 30 views
3

我試圖通過將圖像分成塊網格並獲得每個塊的像素總和來對黑色和白色區域的像素值求和。圖像像素總和

當我打印每個值時,值都是相同的= 255。我的問題是:爲什麼會發生這種情況?有些塊只有黑色像素,有些塊有黑色和白色?

double* divide (Mat I) 
     { 
      //double* pointer; 
     static double* sums= new double [9]; 
     //pointer= sums[0]; 
      //double sums2[10]; 

      Mat block; 
       //Mat block2; 

    int numberblocks=9; 
    int bh; 
    int bw; 
    //int bh2; 
    //int bw2; 

    bh=I.cols/numberblocks; 
    bw=I.rows/numberblocks; 
    //bh2=u.cols/numberblocks; 
    //bw2=u.rows/numberblocks; 
    // 
    double blockarea=bh*bw; 
    //double num=0; 
    //double blockarea2=bh2*bw2; 

    //int r=0; 
    //int c=0; 
    //int err=0; 

    for(int a=0;a<9;a++) 
    { 
     for (int r = 0; r < I.rows; r += bw) 
     { 
      for (int c = 0; c < I.cols; c += bh) 
       { 

       block = I(cv::Range(r, min(r + bw, I.rows)),cv::Range(c, min(c + bh, I.cols))); 


        } 
     } 
     double sum=0; 

     for(int i=0;i<block.rows;i++) 
     { 
      for(int j=0;j<block.cols;j++) 
       { 
       sums[a] = sum + block.at<uchar>(i,j); //sums[k-1] + block.at<uchar>(i,j); 
      } 
     } 
     cout<<"sum of"<<a<<"is"<<sums[a]<<endl; 


    } 


return sums; 

}  
+1

如果您希望我們查看它,請確保正確設置代碼的格式。它看起來越好,幫助就越容易。 – Bart

+0

逐步調試代碼並檢查每個變量的值。你會意識到你沒有妥善保存這些錢。也許你需要定義另一個變量。 –

回答

4

我認爲這會做

 for(int i=0;i<block.rows;i++) 
    { 
     for(int j=0;j<block.cols;j++) 
      { 

       sum = sum + block.at<uchar>(i,j); //sums[k-1] + block.at<uchar>(i,j); 
     } 
    } 
    sums[a]=sum; 

調試這是肯定的。如果不使用總和,它將是:

 for(int i=0;i<block.rows;i++) 
    { 
     for(int j=0;j<block.cols;j++) 
      { 

       sums[a] = sums[a] + block.at<uchar>(i,j); //sums[k-1] + block.at<uchar>(i,j); 
     } 
    }   
+0

當我試過這個: - 'double sum = block.at (0,0);對於(int j = 0; j (i,j);對於(int i = 0; i Storm2012

3

總和[α] = +總和block.at(I,J);

看起來很奇怪。總和[a]始終是塊的最後一個元素的值。如果這偶然是255,那麼你有你的解釋。

+1

換句話說,你從來沒有設定總和,所以你實際上並沒有總結任何東西。 – Peter