/*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N D ' U N E I M A G E P A R U N C H A M P G A U S S I E N : */ /* */ /* */ /* Author of '$xci/gauss$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1988??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS /* Introduit le 20071224095359... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #include xci/genere_ch.01.I" #define GAUSS \ FLOT(HUIT) \ /* Efficacite du gaussien, */ #define GAUSS_X2 \ FU #define GAUSS_Y2 \ FU #define GAUSS_Z2 \ FU /* Ponderation des carres des coordonnees 'X', 'Y' et 'Z'. */ #define GAUSS_XY \ FZERO #define GAUSS_YZ \ FZERO #define GAUSS_ZX \ FZERO /* Ponderation des produit de deux coordonnees. */ #define GAUSS_XYZ \ FZERO \ /* Ponderation du produit des trois coordonnees 'X', 'Y' et 'Z'. */ #define INSCRIRE_LE_CHAMP_GAUSSIEN_DANS_UN_CERCLE \ FAUX \ /* Indique si le champ gaussien doit etre inscrit dans un cercle et ce de facon a avoir */ \ /* du NOIR a la peripherie ('VRAI') ou pas ('FAUX'). Cela a ete introduit le 20141105132134, */ \ /* la valeur par defaut garantissant la compatibilite anterieure... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N I T I A L I S A T I O N D ' U N E I M A G E P A R U N C H A M P G A U S S I E N : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); #include xci/genere_ch.02.I" DEFV(Logical,INIT(inscrire_le_champ_gaussien_dans_un_cercle,INSCRIRE_LE_CHAMP_GAUSSIEN_DANS_UN_CERCLE)); /* Indique si le champ gaussien doit etre inscrit dans un cercle et ce de facon a avoir */ /* du NOIR a la peripherie ('VRAI') ou pas ('FAUX'). Cela a ete introduit le 20141105132134, */ /* la valeur par defaut garantissant la compatibilite anterieure... */ /*..............................................................................................................................*/ EGAL(Fgaussien_____coefficient,GAUSS); EGAL(Fgaussien_____coefficient_X2,GAUSS_X2); EGAL(Fgaussien_____coefficient_Y2,GAUSS_Y2); EGAL(Fgaussien_____coefficient_Z2,GAUSS_Z2); EGAL(Fgaussien_____coefficient_XY,GAUSS_XY); EGAL(Fgaussien_____coefficient_YZ,GAUSS_YZ); EGAL(Fgaussien_____coefficient_ZX,GAUSS_ZX); EGAL(Fgaussien_____coefficient_XYZ,GAUSS_XYZ); /* Definition du champ gaussien... */ #include xci/genere_ch.03.I" #include xci/genere_ch.11.I" GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_L("standard=",les_images_sont_standards); PROCESS_ARGUMENT_L("arithmetique_etendue_gauss=""arieg=""ariec=" ,Fgaussien____`use_arithmetique_etendue_et_non_basique ,BLOC(VIDE;) ,BLOC(Bblock EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique ,Fgaussien____`use_arithmetique_etendue_et_non_basique ); Eblock ) ); PROCESS_ARGUMENT_N("arithmetique_de_base_gauss=""aribg=""aribc=" ,Fgaussien____`use_arithmetique_etendue_et_non_basique ,BLOC(VIDE;) ,BLOC(Bblock EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique ,NOTL(Fgaussien____`use_arithmetique_etendue_et_non_basique) ); /* Le 20071226163024 fut introduit le 'NOTL(...)' a cause de 'PROCESS_ARGUMENT_N(...)' car, */ /* en effet, lorsque le 'EGAL(...)' est execute, le parametre logique en cours de traitement */ /* est alors inverse ('v $xig/fonct$vv$DEF NOTL.valeur_L_par_defaut'). */ Eblock ) ); /* Parametres d'arithmetique etendue introduits le 20071224095359... */ GET_ARGUMENT_F("c=",Fgaussien_____coefficient); GET_ARGUMENT_F("cx2=",Fgaussien_____coefficient_X2); GET_ARGUMENT_F("cy2=",Fgaussien_____coefficient_Y2); GET_ARGUMENT_F("cz2=",Fgaussien_____coefficient_Z2); GET_ARGUMENT_F("cxy=",Fgaussien_____coefficient_XY); GET_ARGUMENT_F("cyz=",Fgaussien_____coefficient_YZ); GET_ARGUMENT_F("czx=",Fgaussien_____coefficient_ZX); GET_ARGUMENT_F("cxyz=",Fgaussien_____coefficient_XYZ); PROCESS_ARGUMENTS_DE_PARAMETRAGE_3D_DE_____ACCES_A_UN_CHAMP_3D; /* Introduit le 20060516103326... */ GET_ARGUMENT_L("cercle_inscrit=""cercle=",inscrire_le_champ_gaussien_dans_un_cercle); /* Introduit le 20141105132134... */ ) ); #include xci/genere_ch.04.I" GENERATION_DU_CHAMP_DEMANDE(Fgaussien ,nom_imageR ,AXPB(facteur_Zf,Zf,translation_Zf) ,Tf_ARGUMENT_INUTILE ,IFOU(EST_FAUX(les_images_sont_standards) ,IFET(EST_VRAI(les_images_sont_standards) ,IL_NE_FAUT_PAS(inscrire_le_champ_gaussien_dans_un_cercle) ) ) ); /* L'argument 'Tf_ARGUMENT_INUTILE' a ete introduit le 20100209111608. */ /* */ /* Je rappelle le 20190408142741 que pour faire une gaussienne "carree" (et non pas */ /* "circulaire"...), il convient d'utiliser de plus les arguments suivants : */ /* */ /* arithmetique_etendue_gauss=VRAI */ /* pxADD2_ADD2=0 */ /* pxMAX2_ADD2=1 */ /* */ Test(IL_FAUT(inscrire_le_champ_gaussien_dans_un_cercle)) /* Possibilite introduite le 20141105132134 pour 'v $xiirc/.MANE.41.4.$U 20141105133848'... */ Bblock Test(EST_VRAI(les_images_sont_standards)) Bblock DEFV(genere_p,INIT(niveau_du_cercle ,load_point(ImageR ,COND(IFGE(dimX,dimY),Xmin2,Xmin) ,COND(IFGE(dimX,dimY),Ymin,Ymin2) ) ) ); /* Le niveau du cercle est choisi sur un point proche du bord et ce en fonction du format */ /* de l'image... */ BSaveModifyVariable(genere_p,Ipasse_bande_____niveau_inferieur,niveau_du_cercle); Test(IFLT(niveau_du_cercle,BLANC)) Bblock EGAL(niveau_du_cercle,SUCN(niveau_du_cercle)); /* Afin de laisser une petite marge NOIRe autour du cercle... */ Eblock ATes Bblock Eblock ETes CALS(Ipasse_bande(ImageR ,ImageR ,niveau_du_cercle,BLANC ,VRAI ) ); /* Ainsi, l'exterieur du cercle prend le niveau du cercle... */ CALS(Inormalisation(ImageR,ImageR)); /* Enfin, renormalisation afin d'occuper tout [NOIR,BLANC]... */ CALi(Iupdate_image(nom_imageR,ImageR)); ESaveModifyVariable(genere_p,Ipasse_bande_____niveau_inferieur); Eblock ATes Bblock PRINT_ATTENTION("l'inscription dans un cercle ne peut se faire que pour une image en mode 'standard'"); Eblock ETes Eblock ATes Bblock Eblock ETes RETU_Commande; Eblock ECommande