2016-03-03 2 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 одномерный массив, хранящийся в строке-мажорных порядке. Вот как вы вычисляете, где datapoint (x, y) в m по n 2D-массиву. – rts1

+0

Изображение хранится в массиве, и что будет 'p [x] [y]' в двумерном массиве - это 'p [x * columns + y]' (или, что эквивалентно, столбцы '* (p + x *) + y) '). – molbdnilo

+0

использует современный интерфейс C++ – dynamic

ответ

1

Im является указатель на структуру изображения

Im->Data указывает на буфер. Назовем это buffer

Im->Cols указывает количество столбцов. num_columns

buffer + x * num_columns + y указывает на пиксель

Кстати, это очень неэффективный способ перемещения вашего изображения, потому что вы вычисления положения для каждой точки.

У вас уже есть 2 петли. Нет смысла использовать этот макрос. Вы можете легко использовать один указатель и настроить его.

Нечто похожее на это было бы более эффективным (я не проверял):

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; 
} 
Смежные вопросы