/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N T R I P L E T D E P O I N T S E T G E N E R A T I O N */ /* D ' U N C H A M P D E P O T E N T I E L P A R F I L T R A G E D E F O U R I E R : */ /* */ /* */ /* Author of '$xrq/triplet.10$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1989??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ @define PRAGMA_CPP_____MODULE_NON_DERIVABLE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE #include image_image_IMAGESF_EXT #include image_image_IMAGESJ_EXT #include maths_trans_FOURIER_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define NIVEAU_DE_MARQUAGE_DU_TRIPLET \ BLANC \ /* Niveau de marquage des points. */ #define NOM_DU_FILTRE \ "images/outils/GAUSS.8110" \ /* Nom du filtre d'elimination des hautes frequences. */ #define SEUIL_D_ETALEMENT_DU_FILTRE \ PARE(252) \ /* Definition de la partie superieure du spectre conservee dans les */ \ /* frequences basses. */ #define X_TRANSLATION \ MOIT(dimX) \ /* Translation horizontale du noyau de convolution, */ #define Y_TRANSLATION \ MOIT(dimY) \ /* Translation verticale du noyau de convolution. */ #nodefine NOM_DE_L_IMAGE \ "images/tests/TRIPLET.11" #define NOM_DE_L_IMAGE \ nom_imageR /* Nom de l'image a generer (mise "en conformite" le 20021103123954). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N T R I P L E T D E P O I N T S E T G E N E R A T I O N */ /* D ' U N C H A M P D E P O T E N T I E L P A R F I L T R A G E D E F O U R I E R : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(Int,INIT(seuil_d_etalement_du_filtre,SEUIL_D_ETALEMENT_DU_FILTRE)); /* Seuil de definition du masque d'extraction des frequences basses, ce qui signifie */ /* que l'on ne garde que les points appartenant au segment */ /* [seuil_d_etalement_du_filtre,BLANC] du filtre. */ DEFV(deltaF_2D,translation); /* Translation du champ. */ DEFV(genere_Float,INIT(minimum_reel_de_la_transformee,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_reel_de_la_transformee,FLOT__UNDEF)); /* Donnent le minimum et le maximum de la partie reelle de la transformee */ /* de Fourier, afin de faire ensuite la conversion en une image "standard"... */ DEFV(genere_Float,INIT(minimum_imaginaire_de_la_transformee,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_imaginaire_de_la_transformee,FLOT__UNDEF)); /* Donnent le minimum et le maximum de la partie imaginaire de la transformee */ /* de Fourier. */ /*..............................................................................................................................*/ GET_ARGUMENTSv(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("SX_SY_SZ_____compatibilite_20070416=""compatibilite_20070416=" ,SX_SY_SZ_____compatibilite_20070416 ); /* Parametre introduit le 20070416161921... */ GET_ARGUMENT_C("imageR=""R=",nom_imageR); ) ); begin_nouveau_block Bblock BDEFV(imageJ,transformee_de_fourier_avant_filtrage); /* Image complexe contenant la transformee de Fourier complexe de l'image */ /* Argument (avant filtrage). */ BDEFV(imageJ,transformee_de_fourier_apres_filtrage); /* Image complexe contenant la transformee de Fourier complexe de l'image */ /* Resultat (apres filtrage). */ DEFV(Float,INIT(translation_OX,_____lNORMALISE_OX(X_TRANSLATION))); DEFV(Float,INIT(translation_OY,_____lNORMALISE_OY(Y_TRANSLATION))); /* Argument de translation du noyau initialise a priori en son centre... */ CALS(FgERASE()); CALS(Iinit_Z_Buffer()); SET_ANTI_ALIASING(VRAI); SET_COULEURS(NOIR,NIVEAU_DE_MARQUAGE_DU_TRIPLET); SK(8); /* Definition de l'echelle globale. */ SX(8); /* Definition de l'echelle sur l'axe des 'X'. */ SY(8); /* Definition de l'echelle sur l'axe des 'X'. */ SZ(8); /* Definition de l'echelle sur l'axe des 'Z'. */ g1;g1;g2;g2;gA;gB; /* Marquage du premier point, */ g1;g1;g1;g1;gA;gB; /* Marquage du deuxieme point, */ g3;g3;g2;g2;g2;gA;gB; /* Marquage du troisieme point. */ CALi(Inoir(ImageR)); /* Initialisation de l'image Resultat. */ INITIALISATION_ACCROISSEMENT_2D(translation,translation_OX,translation_OY); /* Definition de la translation sur le noyau. */ CALi(Iload_image(ImageA1,NOM_DU_FILTRE)); /* A1 = image definissant le noyau de filtrage, et */ /* G = image a filtrer. */ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) Bblock MODIFICATION_LISTE_DE_SUBSTITUTION(niveau ,GENP(COND(IFLE(niveau,seuil_d_etalement_du_filtre) ,NOIR ,MAX2(SCAL(SOUS(niveau,seuil_d_etalement_du_filtre) ,SOUS(BLANC,seuil_d_etalement_du_filtre) ,NIVR(BLANC) ) ,NOIR_PLANCHER ) ) ) ); /* La liste de substitution (associee au masque) est telle que tout ce qui */ /* est inferieur au seuil disparait ('NOIR'), et que les autres utilisent tout */ /* le "spectre" [NOIR_PLANCHER,BLANC]. */ Eblock EBoI SUBSTITUTION(L_SUBSTITUTION_VARIABLE); SET_FILTRAGE(ACTIF); CALS(Imove(ImageA2,ImageA1)); /* A2 = filtre "etale". */ SET_FILTRAGE(INACTIF); CALS(Istd_float(IFmage_PR,FLOT__NOIR,FLOT__BLANC,ImageG)); CALS(Istd_float(IFmage_PI,FLOT__NOIR,FLOT__BLANC,ImageR)); CALS(Ireelle_complexe(IJmageA,IFmage_PR)); CALS(Iimaginaire_complexe(IJmageA,IFmage_PI)); /* Generation de l'image Argument complexe a transformee avec (ImageG,NOIR). */ CALS(IJfourier_2D_directe_complexe(transformee_de_fourier_avant_filtrage,IJmageA)); /* On fait la transformee directe, */ CALS(IJfiltrage_multiplicatif(transformee_de_fourier_apres_filtrage ,transformee_de_fourier_avant_filtrage ,ImageA2 ,ImageA2 ,ADRESSE(translation) ,ADRESSE(translation) ) ); /* Filtrage par le noyau "etale", */ CALS(IJfourier_2D_inverse_complexe(IJmageR,transformee_de_fourier_apres_filtrage)); /* Puis la transformee inverse. */ CALS(Icomplexe_reelle(IFmage_PR,IJmageR)); CALS(IFnivo_extrema(IFmage_PR ,ADRESSE(minimum_reel_de_la_transformee) ,ADRESSE(maximum_reel_de_la_transformee) ) ); /* Recherche du minimum et du maximum de la partie reelle de la */ /* transformee de Fourier inverse. */ CALS(Icomplexe_imaginaire(IFmage_PI,IJmageR)); CALS(IFnivo_extrema(IFmage_PI ,ADRESSE(minimum_imaginaire_de_la_transformee) ,ADRESSE(maximum_imaginaire_de_la_transformee) ) ); /* Recherche du minimum et du maximum de la partie imaginaire de la */ /* transformee de Fourier inverse. */ Test(IFGE(SOUS(maximum_imaginaire_de_la_transformee,minimum_imaginaire_de_la_transformee) ,SOUS(maximum_reel_de_la_transformee,minimum_reel_de_la_transformee) ) ) Bblock PRINT_ERREUR("la partie imaginaire est trop importante"); Eblock ATes Bblock Eblock ETes CALS(Ifloat_std(ImageR ,IFmage_PR ,minimum_reel_de_la_transformee ,maximum_reel_de_la_transformee ) ); /* Renormalisation du resultat... */ CALi(Iupdate_image(NOM_DE_L_IMAGE,ImageR)); EDEFV(imageJ,transformee_de_fourier_apres_filtrage); /* Image complexe contenant la transformee de Fourier complexe de l'image */ /* Resultat (apres filtrage). */ EDEFV(imageJ,transformee_de_fourier_avant_filtrage); /* Image complexe contenant la transformee de Fourier complexe de l'image */ /* Argument (avant filtrage). */ Eblock end_nouveau_block RETU_Commande; Eblock ECommande