2011-10-26 27 views
-1

假設我有一個圖像矩陣和我在一個特定的像素[說4]這樣的加載附近的像素:如何使用指針

0 1 2 
3 `4` 5 
6 7 8 

我通過所有的像素試圖循環和我試圖訪問0,1,2,3,5 6,7,8其值我存儲在數組中,名爲Pixel ....這裏是我使用OpenCV的嘗試,請告訴我哪裏出錯了。

我正在使用指針temp_ptr訪問IplImage image

uchar* temp_ptr=0 ; 
    CvScalar Pixel[3][3]; 
    int rows=image->height,cols=image->width,row,col; 
    for(row = 0; row < rows-2; ++row) 
    { 
     for (col = 0; col < cols-2; ++col) 
      {    
        temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row)))[col*3]; 
        for (int krow = -1 ; krow <= 1; krow++) 
        { 
         for (int kcol = -1; kcol <= 1; kcol++) 
         {  
         temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row+krow)))[(col+kcol)*3]; 
          for(int i=0; i < 3; i++) 
          { 
           for(int j=0; j < 3; j++) 
           { 
            for(int k=0; k < 3; k++) 
            { 
             Pixel[i][j].val[k]=temp_ptr[k]; 
            } 
           } 
          } 

         } 
        } 
      } 
    } 

我真的不知道如何使用temp_ptr加載sorrounding像素,請幫助我。

+2

擁有六個嵌套for循環幾乎可以證明你錯誤的地方。你是否需要遍歷所有像素或只有那些可以擁有全部八個「鄰居」的人? – jrok

+0

只有那些可以有8個鄰居....也是我以相同的方式訪問所有像素的方式,我將通過計算所有像素的平均值並存儲來自Color [RBG]數組'Pixel'的新值來存儲值...到中心即「4」像素。 –

+1

你有很多有用的提示。最重要的是,你永遠不會將結果寫回圖像。而且,我不想讓人覺得苛刻,但正如有人說「開始學習編程 - 你的代碼完全混亂」。 Everybodys代碼在開始時是一個完整的混亂,我認爲你應該嘗試自己解決這個問題,並試圖理解你在做什麼。你沒有OpenCV的麻煩。您在編寫算法時遇到困難。一旦你完成了這個任務 - 你就會很好! :-) –

回答

1

好吧,先生,這聽起來像你想要卷積,當你用OpenCV觸手可及的時候,這樣做就有點像在你的Spaghettios上打開一個開罐器,用鈍的力量打開它。

實際上,您所做的幾乎完全是cv::blur(src, dst, cv::Size(3,3))的輸出,除了它還包含平均中心像素。

如果要排除中心像素,那麼你可以創建一個定製的內核 - 只是一個合適的權重矩陣:

[.125 .125 .125 
.125 0 .125 
.125 .125 .125 ] 

cv::filter2d(src, dst, -1, kernel)應用到圖像。

0

假設image->imageData是RGB格式,所以有對每個像素3個字節,你可以做這樣的事情:

int rows = image->height; 
int cols = image->width; 
uchar* temp_ptr = 0; 

CvScalar pixels[8]; 

for (int col = 0; col < image->height - 2; col++) { 
    temp_ptr = image->imageData + image->width * col + 1; 
    for (int row = 0; row < image->width - 2; row++) { 
     temp_ptr += row * 3; 
     pixels[0].val = temp_ptr - width * 3 - 3; // pixel 0 from your example 
     pixels[1].val = temp_ptr - width * 3;  // 1 
     pixels[2].val = temp_ptr - width * 3 + 3; // 2 
     pixels[3].val = temp_ptr - 3;    // 4 
     pixels[4].val = temp_ptr + 3;    // etc... 
     pixels[5].val = temp_ptr + width * 3 - 3; 
     pixels[6].val = temp_ptr + width * 3; 
     pixels[7].val = temp_ptr + width * 3 + 3;  

     // calculate averages here and store them somewhere (in a vector perhaps) 
    } 
} 

注意我沒有測試此代碼。

+0

甚至不會編譯... –

+0

我不知道opencv。例如,我只是猜測CvScalar.val的類型是uchar [3]。我只是想給你一個想法,而不是可編譯的準備去代碼:) – jrok

0

首先你必須開始學習一些編程。你的完整代碼是一團糟。 一些重大問題,我可以很快發現:

  • 首先,你必須從1開始的前兩個for循環(因爲你-1,當你申請的窗口遞減)的,你最終會讀一些內存未分配的地址。
  • 第二個第一個temp_ptr = &((uchar *)(image-> imageData +(image-> widthStep * row)))[col * 3]是無用的,因此您可以將其刪除。
  • 其他

    temp_ptr = &((uchar*)(image->imageData + (image->widthStep*row+krow)))[(col+kcol)*3]; 
    

是有一個小問題,運算符優先級,應該是:

temp_ptr = &((uchar*)(image->imageData + image->widthStep*(row+krow))[(col+kcol)*3]; 
  • 你不需要其他3內循環

還不清楚是什麼y你想要做的,你想得到一個特定像素的鄰域(然後你不需要循環),或者你想要從圖像中的每個像素應用一個內核。

+0

alinoz你的答案是錯誤的,我不知道誰upvoted它...應該知道,數據類型CvScalar是一個結構,其中包含名爲'val'的數組,您可以在其中存儲'RBG'值! –

+0

好的在這方面你是對的。我會編輯那部分,但其餘的我是對的。 – alinoz