2016-03-03 64 views
2

我在看圖像處理算法的掌上手冊(http://adaptiveart.eecs.umich.edu/2011/wp-content/uploads/2011/09/The-pocket-handbook-of-image-processing-algorithms-in-C.pdf),我碰到這個代碼(下面)。圖像處理算法代碼,解釋指針

誰能幫我瞭解

*(Im->Data + (x)*Im->Cols + (y)) 

這是PDF頁面33

#define pix(Im,x,y) \ 
     *(Im->Data + (x)*Im->Cols + (y)) 
/* Compute and return area for objects */ 

int area(struct Image *In, int x1, int y1, int x2, int y2, unsigned char ObjVal){ 
    long i, j, rows; 
    int area_value = 0; 

    for(i=x1; i<=x2; ++i) 
     for(j=y1; j<=y2; ++j){ 
      if(pix(In,i,j)==ObjVal)++area_value; 
     } 
    return(area_value); 
} 
+0

它假定一個2維陣列中,存儲在行優先順序。這就是如何計算m乘n 2D數組中的數據點(x,y)的方式。 – rts1

+0

圖像存儲在一個數組中,二維數組中的p [x] [y]'是'p [x *列+ y]'(或者等價於* *(p + x *列) + y)')。 – molbdnilo

+0

使用現代的C++界面 – dynamic

回答

1

Im上是指向圖像結構

Im->Data所指向的緩衝區。我們稱之爲buffer

Im->Cols表示列數。​​

buffer + x * num_columns + y指向像素

順便說一句,這是遍歷你的形象,因爲你是計算每個點的位置非常低效的方式。

你已經有2 for循環那裏。使用這個宏沒有意義。您可以輕鬆使用單個指針並進行調整。

類似的東西這將是更有效的(I沒有測試它):

int area(struct Image *In, int x1, int y1, int x2, int y2, unsigned char ObjVal) 
{ 
    int area_value = 0; 

    unsigned char *p = Im->Data + x1 * Im->Cols + y1; // Move to the first pixel 

    int adj = In->Cols - (x2-x1)  // How much for the start of next row 

    for(int i=x1; i<=x2; ++i, p += adj) 
    { 
     for(int j=y1; j<=y2; ++j, ++p) 
     { 
      if (*p == ObjVal) ++area_value; 
     } 
    } 

    return area_value; 
}