#include "math.h" #include "stdio.h" #define ALLOCATION_KO 0 #define ALLOCATION_OK 1 #define TERMINE 2 #define ALLOCATION(N,type) new type [N] // pour C++ windows #define DESALLOCATION(pointeur) delete pointeur // pour C++ windows #define EPSILON 1e-32 #define Fabs(a) ( ( (a) > 0.0 ) ? (a) : (-(a)) ) #define Min(a,b) ( ( (a) < (b) ) ? (a) : (b) ) #define Max(a,b) ( ( (a) > (b) ) ? (a) : (b) ) int Derive_image(double * Image, double * Imagex, double * Imagey, int ncol, int nlin, double alpha) //typiquement 0.4 { double ao,oa,ko,klo; double *B1,*B2, *dx, *dy, *dxy ; double *debut, *fin ; int dim,ncol1,nlin1,nbre_d_element; int col,lin; double *pixel_suivant ; double *B_courant, *B_suivant,*B_precedent ; ncol1 = ncol - 1; nlin1 = nlin - 1; nbre_d_element = ncol * nlin; dim = (nlin>ncol) ? nlin : ncol ; ao = ( (alpha>0.0) && (alpha<1.0) ) ? alpha : 0.135 ; oa = 1.0 - ao ; ko = oa/(2.0*ao); klo=1.0/(2.0-ao); /* allocation memoire*/ B1 = ALLOCATION(dim ,double ) ; B2 = ALLOCATION(dim ,double ) ; if((B1==NULL)||(B2==NULL)) { printf( "Impossible d'allouer B1 ou B2 dans la procedure de derivation !!"); return(0) ; } /**********************************/ /* Calcul de la derivee suivant y */ /**********************************/ /* lissage en x */ for( debut=Image, lin=0 ; lin=fin) { (*B_suivant) = ao * (*B_courant) + oa * (*pixel_suivant); B_suivant-- ; B_courant-- ; pixel_suivant-- ; } B_precedent = B1 ; B_suivant = B2 ; dy = Imagey + ( lin * ncol ) ; fin = dy + ncol ; pixel_suivant = Image + (lin * ncol); while(dy=fin) { (*B_suivant) = ao * (*B_courant) + oa * (*pixel_suivant); B_courant-- ; B_suivant--; pixel_suivant-=ncol ; } B_precedent = B1 ; B_suivant = B2 ; dy = Imagey + col ; fin = dy + nlin*ncol; while(dy=fin) { (*B_suivant) = ao * (*B_courant) + oa * (*pixel_suivant); B_suivant-- ; B_courant-- ; pixel_suivant-=ncol ; } B_precedent = B1 ; B_suivant = B2 ; dx = Imagex + col ; fin = dx + nlin *ncol; pixel_suivant = Image + col; while(dx=fin) { (*B_suivant) = ao * (*B_courant) + oa * (*pixel_suivant) ; B_courant-- ; B_suivant--; pixel_suivant-- ; } B_precedent = B1 ; B_suivant = B2 ; dx = Imagex + ( ncol * lin ) ; fin = dx + ncol; while(dxncol) ? nlin : ncol ; ao = ( (alpha>0.0) && (alpha<1.0) ) ? alpha : 0.135 ; oa = 1.0 - ao ; ko = oa/(2.0*ao); klo=1.0/(2.0-ao); /* allocation memoire*/ B1 = ALLOCATION(dim ,double ) ; B2 = ALLOCATION(dim ,double ) ; if((B1==NULL)||(B2==NULL)) { printf( "Impossible d'allouer B1 ou B2 dans la procedure Deriche!!"); return(0) ; } /* lissage en x */ for( debut=Image, lin=0 ; lin=fin) { (*B_suivant) = ao * (*B_courant) + oa * (*pixel_suivant); B_suivant-- ; B_courant-- ; pixel_suivant-- ; } B_precedent = B1 ; B_suivant = B2 ; pt = Image + ( lin * ncol ) ; fin = pt + ncol ; pixel_suivant = Image + (lin * ncol); while(pt=fin) { (*B_suivant) = ao * (*B_courant) + oa * (*pixel_suivant); B_courant-- ; B_suivant--; pixel_suivant-=ncol ; } B_precedent = B1 ; B_suivant = B2 ; pt = Image + col ; fin = pt + nlin*ncol; pixel_suivant = Image + col; while(pt0.0) && (alpha<1.0) ) ? alpha : 0.135 ; oa = 1.0 - ao ; N = nlin * ncol ; ptf = ImageFt ; pti = Image ; fin = pti + N ; // filtrage en t while(pti=0) && (xc=0) && (yc=0) && (xc=0) && (yc=0) && (xc=0) && (yc=0) && (xc=0) && (yc=0) && (x=0) && (yc