/*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N C O M P L E X E --> ( R E E L L E , I M A G I N A I R E , M O D U L E , P H A S E ) : */ /* */ /* */ /* Author of '$xci/J_RIMP$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 : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 image_image_QUAD_IMAGE_EXT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define DECALER_LES_NIVEAUX_DES_PARTIES_REELLE_ET_IMAGINAIRE \ VRAI \ /* Indique si l'on doit faire un 'IJscale(...)' si 'EST_VRAI(les_images_sont_standards)' */ \ /* ('VRAI') sur les parties Reelle et Imaginaire ou les laisser tel quel ('FAUX'). */ #define CALCULER_LE_MODULE_ET_LA_PHASE \ VRAI \ /* Faut-il calculer le module et la phase ('VRAI') ou uniquement les parties Reelle et */ \ /* Imaginaire ('FAUX') ? Ceci a ete introduit le 20030210114649. */ #define PRENDRE_UNE_DYNAMIQUE_LOGARITHMIQUE_POUR_LE_MODULE \ FAUX \ /* Faut-il prendre une dynamique logarithmique ('VRAI') pour le module ou le laisser tel */ \ /* qu'il a ete calcule ('FAUX') ? */ #define ECHELLE_DE_CUTOFF \ FZERO \ /* L'echelle de "cutoff" est dans [0,1] ; pour '0' tout est conserve, alors que pour '1' */ \ /* tout est supprime (et remplace par le marqueur des niveaux faibles...). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #define TRANSLATION_DES_NIVEAUX_FAIBLES \ DOUB(DIVI(SOUS(maximum_de_la_phase,minimum_de_la_phase),FLOT(COULEURS))) \ /* Pour passer du minimum de la phase au niveau de marquage des points correspondants a */ \ /* a une faible valeur du module ("cutoff"). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N C O M P L E X E --> ( R E E L L E , I M A G I N A I R E , M O D U L E , P H A S E ) : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageRR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageRI),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageRP),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageRM),NOM_PIPE)); /* Nom des quatre images resultat (Reelle, Imaginaire, Phase, Module). */ DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE)); /* Nom de l'image complexe que l'on va convertir. */ DEFV(Logical,INIT(calculer_le_module_et_la_phase,CALCULER_LE_MODULE_ET_LA_PHASE)); /* Faut-il calculer le module et la phase ('VRAI') ou uniquement les parties Reelle et */ /* Imaginaire ('FAUX') ? Ceci a ete introduit le 20030210114649. */ DEFV(genere_Float,INIT(minimum_reel,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_reel,FLOT__UNDEF)); /* Donnent le minimum et le maximum de la partie reelle de l'image Argument, */ DEFV(genere_Float,INIT(minimum_imaginaire,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_imaginaire,FLOT__UNDEF)); /* Donnent le minimum et le maximum de la partie imaginaire de l'image Argument. */ DEFV(genere_Float,INIT(minimum_du_module,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_du_module,FLOT__UNDEF)); /* Donnent le minimum et le maximum du module de l'image Argument, */ DEFV(genere_Float,INIT(minimum_de_la_phase,FLOT__UNDEF)); DEFV(genere_Float,INIT(maximum_de_la_phase,FLOT__UNDEF)); /* Donnent le minimum et le maximum de la phase de l'image Argument. */ DEFV(Logical,INIT(decaler_les_niveaux_des_parties_Reelle_et_imaginaire,DECALER_LES_NIVEAUX_DES_PARTIES_REELLE_ET_IMAGINAIRE)); /* Indique si l'on doit faire un 'IJscale(...)' si 'EST_VRAI(les_images_sont_standards)' */ /* ('VRAI') sur les parties Reelle et Imaginaire ou les laisser tel quel ('FAUX'). */ DEFV(Logical,INIT(prendre_une_dynamique_logarithmique_pour_le_module,PRENDRE_UNE_DYNAMIQUE_LOGARITHMIQUE_POUR_LE_MODULE)); /* Faut-il prendre une dynamique logarithmique ('VRAI') pour le module ou le laisser tel */ /* qu'il a ete calcule ('FAUX') ? */ DEFV(Float,INIT(echelle_de_cutoff,ECHELLE_DE_CUTOFF)); /* L'echelle de "cutoff" est dans [0,1] ; pour '0' tout est conserve, alors que pour '1' */ /* tout est supprime (et remplace par le marqueur des niveaux faibles...). */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_C("A=",nom_imageA); GET_ARGUMENT_C("imageRR=""RR=",nom_imageRR); GET_ARGUMENT_C("imageRI=""RI=",nom_imageRI); GET_ARGUMENT_C("imageRM=""RM=",nom_imageRM); GET_ARGUMENT_C("imageRP=""RP=",nom_imageRP); GET_ARGUMENT_L("standard=",les_images_sont_standards); GET_ARGUMENT_L("mp=""module_phase=",calculer_le_module_et_la_phase); GET_ARGUMENT_L("decaler=",decaler_les_niveaux_des_parties_Reelle_et_imaginaire); GET_ARGUMENT_L("logarithmique=""log=",prendre_une_dynamique_logarithmique_pour_le_module); GET_ARGUMENT_F("cutoff=",echelle_de_cutoff); ) ); CALi(Inoir(ImageA1)); CALi(Inoir(ImageA2)); CALi(Inoir(ImageA3)); CALi(Inoir(ImageA4)); CALi(IFinitialisation(IFmage_PR,FZERO)); CALi(IFinitialisation(IFmage_PI,FZERO)); CALi(IFinitialisation(IFmage_Mo,FZERO)); CALi(IFinitialisation(IFmage_Ph,FZERO)); /* Initialisation de quatre images Resultat avant le changement eventuel de (pasX,pasY). */ Test(PAS_D_ERREUR(CODE_ERROR(IloadJ_image(IJmageA,nom_imageA)))) Bblock /* Acces a l'image Argument que l'on veut convertir en (R,I,M,P). */ CALS(Icomplexe_reelle(IFmage_PR,IJmageA)); CALS(Icomplexe_imaginaire(IFmage_PI,IJmageA)); /* Recuperation des parties reelles et imaginaires. */ Test(IL_FAUT(calculer_le_module_et_la_phase)) Bblock CALS(Iconversion_XY_RT(IFmage_Mo,IFmage_Ph ,IFmage_PR,IFmage_PI ) ); /* Calcul des modules et des phases dans [0,2.PI], */ Eblock ATes Bblock Eblock ETes Test(EST_VRAI(les_images_sont_standards)) Bblock /* Cas des images 'image' : */ Test(IL_FAUT(calculer_le_module_et_la_phase)) Bblock CALS(IFnivo_extrema(IFmage_Mo ,ADRESSE(minimum_du_module) ,ADRESSE(maximum_du_module) ) ); /* Recherche du minimum et du maximum du module de l'image Argument. */ CALS(IFnivo_extrema(IFmage_Ph ,ADRESSE(minimum_de_la_phase) ,ADRESSE(maximum_de_la_phase) ) ); /* Recherche du minimum et du maximum de la phase de l'image Argument. */ CALS(IFcutoff(IFmage_Ph ,SOUS(minimum_de_la_phase,TRANSLATION_DES_NIVEAUX_FAIBLES) ,IFmage_Ph ,ADD2(minimum_du_module,MUL2(SOUS(maximum_du_module,minimum_du_module),echelle_de_cutoff)) ,IFmage_Mo ) ); /* Cutoff de la phase a l'aide du module... */ CALS(IFscale(IFmage_Ph ,DIVI(FLOT(COULEURS),ADD2(TRANSLATION_DES_NIVEAUX_FAIBLES,CERCLE_TRIGONOMETRIQUE)) ,IFmage_Ph ,MUL2(DIVI(FLOT(COULEURS),ADD2(TRANSLATION_DES_NIVEAUX_FAIBLES,CERCLE_TRIGONOMETRIQUE)) ,TRANSLATION_DES_NIVEAUX_FAIBLES ) ) ); /* Calcul des phases dans [NOIR,BLANC]... */ Eblock ATes Bblock Eblock ETes Test(IL_FAUT(decaler_les_niveaux_des_parties_Reelle_et_imaginaire)) Bblock CALS(IFscale(IFmage_PR ,FU ,IFmage_PR ,FLOT(NEUT(MOIT(COULEURS))) ) ); CALS(IFscale(IFmage_PI ,FU ,IFmage_PI ,FLOT(NEUT(MOIT(COULEURS))) ) ); Eblock ATes Bblock Eblock ETes CALS(IFnivo_extrema(IFmage_PR ,ADRESSE(minimum_reel) ,ADRESSE(maximum_reel) ) ); /* Recherche du minimum et du maximum de la partie reelle de l'image Argument. */ Test(IFOU(IFGE(SOUS(FLOT__NOIR,minimum_reel),FU) ,IFGE(SOUS(maximum_reel,FLOT__BLANC),FU) ) ) /* Nota : on n'oubliera pas que par definition 'minimum <= maximum'... */ Bblock PRINT_ATTENTION("renormalisation de la partie reelle"); CAL1(Prer1("minimum=%.^^^\n" ,minimum_reel ) ); /* Le 20060105154420, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123140, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL1(Prer1("maximum=%.^^^\n" ,maximum_reel ) ); /* Le 20060105154420, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123140, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CALS(Ifloat_std(ImageA1 ,IFmage_PR ,minimum_reel ,maximum_reel ) ); /* A1 = generation de l'image "partie reelle" (avec renormalisation). */ /* lorsque les niveaux minimal et maximal sont hors de [NOIR,BLANC], on renormalise... */ Eblock ATes Bblock CALS(Ifloat_std(ImageA1 ,IFmage_PR ,FLOT__NOIR ,FLOT__BLANC ) ); /* A1 = generation de l'image "partie reelle" (avec renormalisation). */ /* les niveaux minimal et maximal sont dans [NOIR,BLANC] et on */ /* ne renormalise pas... */ Eblock ETes CALS(IFnivo_extrema(IFmage_PI ,ADRESSE(minimum_imaginaire) ,ADRESSE(maximum_imaginaire) ) ); /* Recherche du minimum et du maximum de la partie imaginaire de l'image Argument. */ Test(IFOU(IFGE(SOUS(FLOT__NOIR,minimum_imaginaire),FU) ,IFGE(SOUS(maximum_imaginaire,FLOT__BLANC),FU) ) ) /* Nota : on n'oubliera pas que par definition 'minimum <= maximum'... */ Bblock PRINT_ATTENTION("renormalisation de la partie imaginaire"); CAL1(Prer1("minimum=%.^^^\n" ,minimum_imaginaire ) ); /* Le 20060105154420, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123140, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CAL1(Prer1("maximum=%.^^^\n" ,maximum_imaginaire ) ); /* Le 20060105154420, le format "16g" est passe a "^^g" pour plus de souplesse... */ /* */ /* Le 20091123123140, le format "^^g" est passe a "^^^" pour plus de souplesse... */ CALS(Ifloat_std(ImageA2 ,IFmage_PI ,minimum_imaginaire ,maximum_imaginaire ) ); /* A2 = generation de l'image "partie imaginaire" (avec renormalisation). */ /* lorsque les niveaux minimal et maximal sont hors de [NOIR,BLANC], on renormalise... */ Eblock ATes Bblock CALS(Ifloat_std(ImageA2 ,IFmage_PI ,FLOT__NOIR ,FLOT__BLANC ) ); /* A2 = generation de l'image "partie imaginaire" (avec renormalisation). */ /* les niveaux minimal et maximal sont dans [NOIR,BLANC] et on */ /* ne renormalise pas... */ Eblock ETes Test(IL_FAUT(calculer_le_module_et_la_phase)) Bblock Test(IL_FAUT(prendre_une_dynamique_logarithmique_pour_le_module)) Bblock CALS(IFdynamique_logarithmique_avec_translation_dynamique(IFmage_Mo,IFmage_Mo)); /* S'il le faut, la dynamique du module est reduite par application d'une fonction */ /* logarithme... */ Eblock ATes Bblock Eblock ETes CALS(Ifloat_std_avec_renormalisation(ImageA3 ,IFmage_Mo ) ); /* A3 = generation de l'image "module" (avec renormalisation). */ CALS(Ifloat_std(ImageA4 ,IFmage_Ph ,FLOT__NOIR ,FLOT__BLANC ) ); /* A4 = generation de l'image "phase" (sans renormalisation, afin de conserver toute */ /* l'information, et en particulier voir des "trous" dans [0,2.PI]). */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas des images 'imageF' : */ Test(IL_FAUT(calculer_le_module_et_la_phase)) Bblock Test(IL_FAUT(prendre_une_dynamique_logarithmique_pour_le_module)) Bblock CALS(IFdynamique_logarithmique_avec_translation_dynamique(IFmage_Mo,IFmage_Mo)); /* S'il le faut, la dynamique du module est reduite par application d'une fonction */ /* logarithme... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes CALi(gIupdate_image(les_images_sont_standards,nom_imageRR,ImageA1,IFmage_PR)); CALi(gIupdate_image(les_images_sont_standards,nom_imageRI,ImageA2,IFmage_PI)); Test(IL_FAUT(calculer_le_module_et_la_phase)) Bblock CALi(gIupdate_image(les_images_sont_standards,nom_imageRM,ImageA3,IFmage_Mo)); CALi(gIupdate_image(les_images_sont_standards,nom_imageRP,ImageA4,IFmage_Ph)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes RETU_Commande; Eblock ECommande