typedef struct punto { int x, y; } PUNTO; typedef struct { int area; float dx, dy; // Datos del centroide PUNTO pmin, pmax; // Datos de la caja envolvente } CENDATA; /** E la imagen de entrada S es la imagen de salida v los datos del objeto El perĂ­metro queda almacenado en la imagen de entrada. En la imagen de salida se almacena la imagen erosionada. **/ void erosion_cruz( MATRIX *E, MATRIX *S, CENDATA *v ) { int i, j, k; byte *ptrin, *ptrout; int val; /** Se limpia la imagen de salida **/ for( i=v->pmin.y; i<=v->pmax.y; i++ ) { ptrout = (byte *) S->ptr[i] + v->pmin.x; for( j=v->pmin.x; j<=v->pmax.x; j++ ) *ptrout++ = 0; } /** Procesamos **/ for( i=v->pmin.y-1; i<=v->pmax.y - 2; i++ ) { ptrout = (byte *) S->ptr[i+1] + v->pmin.x; for( j=v->pmin.x-1; j<=v->pmax.x - 2; j++ ) { val = 0xff; ptrin = (byte *) E->ptr[i] + j + 1; val &= *ptrin; ptrin = (byte *) E->ptr[i+1] + j; for( k=0; k<3; k++ ) val &= *ptrin++; ptrin = (byte *) E->ptr[i+2] + j + 1; val &= *ptrin; if ( val ) *ptrout = 255; ptrout++; } } /** Aqui se obtiene el perĂ­metro **/ for( i=v->pmin.y; i<=v->pmax.y; i++ ) { ptrin = (byte *) S->ptr[i] + v->pmin.x; ptrout = (byte *) E->ptr[i] + v->pmin.x; for( j=v->pmin.x; j<=v->pmax.x; j++ ) { if( *ptrin ) *ptrout = 0; ptrin++; ptrout++; } } }