/*************************************************************************************************************************************/ /* */ /* P R O D U I T M A T R I C I E L D E D E U X I M A G E S : */ /* */ /* */ /* Definition : */ /* */ /* Cette commande genere une image */ /* dont le nom est le premier argument */ /* d'appel ; elle est le resultat du */ /* produit matriciel des deux images */ /* Arguments. */ /* */ /* */ /* Author of '$xci/multi_02.03$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 20080108130041... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ #define RENORMALISER_L_IMAGE \ VRAI \ /* Faut-il ou pas renormaliser l'image filtree... */ #define CALCULER_UN_CARRE_PLUTOT_QU_UN_PRODUIT \ FAUX \ /* Indique s'il faut ('VRAI') ou pas ('FAUX') calculer plutot le carre d'une image. Ceci */ \ /* a ete introduit le 20110920154601 explicitement a fin de pouvoir etre utilise dans un */ \ /* "pipe" car, en effet, on pouvait au prealable calculer le carre d'une image en donnant */ \ /* en arguments "A1=" et "A2=" deux fois la meme image, mais evidemment cela ne marchait */ \ /* pas a l'interieur d'un "pipe"... */ #define NOMBRE_D_ITERATIONS_DU_CARRE \ UN \ /* Le 20140827150918 a ete introduite la possibilite d'iterer l'elevation au carre... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P R O D U I T M A T R I C I E L D E D E U X I M A G E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA1),NOM_PIPE)); DEFV(CHAR,INIC(POINTERc(nom_imageA2),NOM_PIPE)); DEFV(Logical,INIT(renormaliser_l_image,RENORMALISER_L_IMAGE)); /* Afin de renormaliser (eventuellement) l'image obtenue apres filtrage afin */ /* qu'elle occupe tous les niveaux de [NOIR,BLANC]. */ DEFV(Logical,INIT(calculer_un_carre_plutot_qu_un_produit,CALCULER_UN_CARRE_PLUTOT_QU_UN_PRODUIT)); /* Indique s'il faut ('VRAI') ou pas ('FAUX') calculer plutot le carre d'une image. Ceci */ /* a ete introduit le 20110920154601 explicitement a fin de pouvoir etre utilise dans un */ /* "pipe" car, en effet, on pouvait au prealable calculer le carre d'une image en donnant */ /* en arguments "A1=" et "A2=" deux fois la meme image, mais evidemment cela ne marchait */ /* pas a l'interieur d'un "pipe"... */ DEFV(Positive,INIT(nombre_d_iterations_du_carre,NOMBRE_D_ITERATIONS_DU_CARRE)); /* Le 20150211115912 a ete introduite la possibilite d'iterer l'elevation au carre... */ /*..............................................................................................................................*/ GET_ARGUMENTSi(nombre_d_arguments ,BLOC(GET_ARGUMENT_L("Iproduit_matriciel_____compatibilite_20080108=""compatibilite_20080108=" ,Iproduit_matriciel_____compatibilite_20080108 ); GET_ARGUMENT_L("IFproduit_matriciel_____compatibilite_20080109=""compatibilite_20080109=" ,IFproduit_matriciel_____compatibilite_20080109 ); /* Parametres introduits le 20080109081819... */ GET_ARGUMENT_C("imageA1=""A1=""imageA=""A=",nom_imageA1); /* Les arguments "imageA=" et "A=" ont ete introduits le 20110920160439... */ GET_ARGUMENT_C("imageA2=""A2=",nom_imageA2); GET_ARGUMENT_C("imageR=""R=",nom_imageR); GET_ARGUMENT_L("standard=",les_images_sont_standards); GET_ARGUMENTS2_L("valider_dimX_dimY_pasX_pasY=""vdpXY=""vdp=" ,Iproduit_matriciel_____valider_dimX_dimY_et_pasX_pasY ,IFproduit_matriciel_____valider_dimX_dimY_et_pasX_pasY ); /* Arguments introduits le 20111007174126... */ GET_ARGUMENTS2_I("demi_amplitude_balayage_lignes_colonnes=""dablc=""da=" ,Iproduit_matriciel_____demi_amplitude_de_balayage_des_lignes_et_des_colonnes ,IFproduit_matriciel_____demi_amplitude_de_balayage_des_lignes_et_des_colonnes ); /* Arguments introduits le 20110919181257... */ GET_ARGUMENTS2_F("ponderation_X_Xmin=""pXXmin=" ,Iproduit_matriciel_____ponderation_X_Xmin ,IFproduit_matriciel_____ponderation_X_Xmin ); GET_ARGUMENTS2_F("ponderation_X_X=""pXX=" ,Iproduit_matriciel_____ponderation_X_X___ ,IFproduit_matriciel_____ponderation_X_X___ ); GET_ARGUMENTS2_F("ponderation_X_Y=""pXY=" ,Iproduit_matriciel_____ponderation_X_Y___ ,IFproduit_matriciel_____ponderation_X_Y___ ); GET_ARGUMENTS2_F("translation_X=""tX=" ,Iproduit_matriciel_____translation_X_____ ,IFproduit_matriciel_____translation_X_____ ); GET_ARGUMENTS2_F("ponderation_Y_Ymax=""pYYmax=" ,Iproduit_matriciel_____ponderation_Y_Ymax ,IFproduit_matriciel_____ponderation_Y_Ymax ); GET_ARGUMENTS2_F("ponderation_Y_Y=""pYY=" ,Iproduit_matriciel_____ponderation_Y_Y___ ,IFproduit_matriciel_____ponderation_Y_Y___ ); GET_ARGUMENTS2_F("ponderation_Y_X=""pYX=" ,Iproduit_matriciel_____ponderation_Y_X___ ,IFproduit_matriciel_____ponderation_Y_X___ ); GET_ARGUMENTS2_F("translation_Y=""tY=" ,Iproduit_matriciel_____translation_Y_____ ,IFproduit_matriciel_____translation_Y_____ ); /* Arguments introduits le 20110919181257. On notera qu'avec : */ /* */ /* demi_amplitude_balayage_lignes_colonnes=0 */ /* ponderation_X_Xmin=0 */ /* ponderation_X_X=1 */ /* ponderation_X_Y=0 */ /* ponderation_Y_Ymax=0 */ /* ponderation_Y_Y=1 */ /* ponderation_Y_X=0 */ /* */ /* alors 'v $xci/multi_02.01$K' et 'v $xci/multi_02.03$K' donnent les memes resultats, */ /* c'est-a-dire le produit terme a terme des deux images... */ /* */ /* Le 20110922075608 ces arguments sont passes de 'Int' a 'Float'... */ /* */ /* Les deux translations ont ete introduites le 20110922080836... */ PROCESS_ARGUMENT_L("arithmetique_etendue_produit_matriciel=""ariepm=" ,IFproduit_matriciel____`use_arithmetique_etendue_et_non_basique ,BLOC(VIDE;) ,BLOC(Bblock EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique ,IFproduit_matriciel____`use_arithmetique_etendue_et_non_basique ); Eblock ) ); PROCESS_ARGUMENT_N("arithmetique_de_base_produit_matriciel=""aribpm=" ,IFproduit_matriciel____`use_arithmetique_etendue_et_non_basique ,BLOC(VIDE;) ,BLOC(Bblock EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique ,NOTL(IFproduit_matriciel____`use_arithmetique_etendue_et_non_basique) ); /* Le 'NOTL(...)' est absolument necessaire 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 20080108135510... */ GET_ARGUMENT_L("ignorer_couples_nuls=""icn=""i0=" ,IFproduit_matriciel_____ignorer_les_couples_de_niveaux_nuls ); /* Parametre introduit le 20080109083426... */ GET_ARGUMENT_L("rn=""renormaliser=",renormaliser_l_image); GET_ARGUMENT_L("carre_image=""ci=""c=",calculer_un_carre_plutot_qu_un_produit); GET_ARGUMENT_N("produit_images=""pi=""p=",calculer_un_carre_plutot_qu_un_produit); /* Arguments introduits le 20110920154601... */ GET_ARGUMENT_I("iterations=""nombre_carres=""nombre=""n=",nombre_d_iterations_du_carre); /* Arguments introduits le 20150211115912... */ PROCESS_ARGUMENT_I("exposant=""exp=" ,nombre_d_iterations_du_carre ,BLOC(VIDE;) ,BLOC( Bblock EGAL(nombre_d_iterations_du_carre,TRMU(nombre_d_iterations_du_carre)); Eblock ) ); /* Arguments introduits le 20150211115912... */ ) ); Test(IFET(IL_FAUT(IFproduit_matriciel____`use_arithmetique_etendue_et_non_basique) ,EST_VRAI(les_images_sont_standards) ) ) Bblock /* Test introduit le 20080109104123... */ PRINT_ATTENTION("l'arithmetique etendue n'a pas d'interet pour les images standards, elle est donc desactivee"); EGAL(IFproduit_matriciel____`use_arithmetique_etendue_et_non_basique,FAUX); EGAL(si_le_GooF_est_activable`use_arithmetique_etendue_et_non_basique,FAUX); /* L'aritmetique etendue est donc desactivee dans ce cas... */ Eblock ATes Bblock Eblock ETes CALi(gInettoyage(les_images_sont_standards,ImageR,IFmageR)); /* Initialisation de l'image Resultat. */ Test(IL_NE_FAUT_PAS(calculer_un_carre_plutot_qu_un_produit)) Bblock /* Test introduit le 20110920154601... */ Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageA1,IFmageA1,nom_imageA1)))) Bblock /* Chargement de la premiere image Argument. */ Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageA2,IFmageA2,nom_imageA2)))) Bblock /* Chargement de la deuxieme image Argument. */ CALS(gIproduit_matriciel(les_images_sont_standards ,les_images_standards_sont_a_renormaliser ,ImageR,IFmageR ,ImageA1,IFmageA1 ,ImageA2,IFmageA2 ) ); /* Et produit matriciel des deux images Arguments. */ CALi(gIupdate_image(les_images_sont_standards,nom_imageR,ImageR,IFmageR)); Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ATes Bblock Test(IFNE_chaine(nom_imageA2,NOM_PIPE)) Bblock PRINT_ATTENTION("lors du calcul du carre matriciel d'une image, un seul nom doit etre donne"); Eblock ATes Bblock Eblock ETes Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_images_sont_standards,ImageR,IFmageR,nom_imageA1)))) Bblock /* Chargement de l'image Argument unique. */ Repe(nombre_d_iterations_du_carre) Bblock CALS(gImove(les_images_sont_standards,ImageA1,IFmageA1,ImageR,IFmageR)); CALS(gIproduit_matriciel(les_images_sont_standards ,les_images_standards_sont_a_renormaliser ,ImageR,IFmageR ,ImageA1,IFmageA1 ,ImageA1,IFmageA1 ) ); /* Et puissance matricielle de l'image Argument unique. */ Eblock ERep CALi(gIupdate_image(les_images_sont_standards,nom_imageR,ImageR,IFmageR)); Eblock ATes Bblock Test__CODE_ERREUR__ERREUR07; Eblock ETes Eblock ETes RETU_Commande; Eblock ECommande