/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.