/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E G R A T I O N   D ' U N E   S E R I E   D ' I M A G E S   P A R   S U I V I   D U   G R A D I E N T                */
/*        T R I - D I M E N S I O N N E L   E T   " B R O U I L L A G E "   D ' U N E   I M A G E  :                                 */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Cette commande parcourt d'avant (la premiere                                                                   */
/*                  image) en arriere (la derniere image) une                                                                        */
/*                  serie d'images ; ce suivi se fait en calculant                                                                   */
/*                  les gradients locaux : il s'agit un peu d'un                                                                     */
/*                  "Ray Tracing" a l'interieur d'un milieu d'indice                                                                 */
/*                  variable. Le resultat est une image vue a travers                                                                */
/*                  ce milieu.                                                                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/integre.03$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_QUAD_IMAGE_EXT

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  xci/sequence.01.I"

#define   FACTEUR_MULTIPLICATIF_DU_GRADIENT                                                                                             \
                    FRA16(FRA16(FU))                                                                                                    \
                                        /* Pour accentuer ou diminuer les effets du gradient.                                        */
#define   SENS_DIRECT                                                                                                                   \
                    VRAI                                                                                                                \
                                        /* Cet indicateur precise le sens du brouillage :                                            */ \
                                        /*                                                                                           */ \
                                        /*                  VRAI    : imageR[brouillage(X)][brouillage(Y)]=imageA[X][Y],             */ \
                                        /*                  FAUX    : imageR[X][Y]=imageA[brouillage(X)][brouillage(Y)].             */ \
                                        /*                                                                                           */
#define   MARQUER_LES_POINTS_ATTEINTS                                                                                                   \
                    FAUX                                                                                                                \
                                        /* Cet indicateur precise s'il faut ('VRAI') ou pas ('FAUX') generer une image 'Marqueur'    */ \
                                        /* indiquant quels sont les points non atteints par le brouillage...                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LOAD_AND_BROUILLE(imageA1,imageA2,imageA3)                                                                                    \
                    Bblock                                                                                                              \
                    Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(imageA3,nom_image))))                                                      \
                         Bblock                                                                                                         \
                                        /* 'ImageA3' donne la couche a l'instant courant.                                            */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Test__CODE_ERREUR__ERREUR07;                                                                                   \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    CALS(Isuivi_du_gradient(matrice_de_brouillage,facteur_multiplicatif_du_gradient,imageA1,imageA2,imageA3));          \
                                        /* Traitement des trois images courantes.                                                    */ \
                    Eblock                                                                                                              \
                                        /* Chargement de l'image courante, et traitement avec les deux precedentes.                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E G R A T I O N   D ' U N E   S E R I E   D ' I M A G E S   P A R   S U I V I   D U   G R A D I E N T                */
/*        T R I - D I M E N S I O N N E L   E T   " B R O U I L L A G E "   D ' U N E   I M A G E  :                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageM),NOM_PIPE));
                                        /* Nom du Marqueur des points brouilles.                                                     */
     DEFV(CHAR,INIC(POINTERc(nom_imageB),NOM_PIPE));
                                        /* Nom de l'image a Brouiller.                                                               */
     DEFV(CHAR,INIC(POINTERc(nom_imageA),NOM_PIPE));
                                        /* Nom de la sequence a integrer.                                                            */
     DEFV(CHAR,INIC(POINTERc(nom_postfixe),NOM_UNDEF_VIDE));
                                        /* Nom d'un eventuel postfixe a placer derriere <nom_imageA><numero> (par exemple '$ROUGE'). */
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
                                        /* Nom du Resultat de l'integration.                                                         */
     DEFV(Int,INIT(premiere_image,FLOT(PREMIERE_IMAGE)));
                                        /* Numero de la premiere image,                                                              */
     DEFV(Int,INIT(derniere_image,FLOT(DERNIERE_IMAGE)));
                                        /* Numero de la derniere image.                                                              */
     DEFV(Int,INIT(pas_des_images,FLOT(PAS_DES_IMAGES)));
                                        /* Pas de passage d'un numero d'image a une autre.                                           */
     DEFV(Int,INIT(nombre_de_chiffres,NOMBRE_DE_CHIFFRES));
                                        /* Nombre de chiffres codant le numero des images de la serie...                             */
     DEFV(Int,INIT(numero_d_image,UNDEF));
                                        /* Numero de l'image courante.                                                               */
     DEFV(CHAR,INIT(POINTERc(nom_image),NOM_UNDEF));
                                        /* Nom courant des images.                                                                   */
     DEFV(Float,INIT(facteur_multiplicatif_du_gradient,FACTEUR_MULTIPLICATIF_DU_GRADIENT));
                                        /* Pour accentuer ou diminuer les effets du gradient.                                        */
     DEFV(Logical,INIT(sens_direct,SENS_DIRECT));
                                        /* Cet indicateur precise le sens du brouillage :                                            */
                                        /*                                                                                           */
                                        /*                  VRAI    : imageR[brouillage(X)][brouillage(Y)]=imageA[X][Y],             */
                                        /*                  FAUX    : imageR[X][Y]=imageA[brouillage(X)][brouillage(Y)].             */
                                        /*                                                                                           */
     DEFV(Logical,INIT(marquer_les_points_atteints,MARQUER_LES_POINTS_ATTEINTS));
                                        /* Cet indicateur precise s'il faut ('VRAI') ou pas ('FAUX') generer une image 'Marqueur'    */
                                        /* indiquant quels sont les points non atteints par le brouillage...                         */
     /*..............................................................................................................................*/
     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_C("imageA=""A=",nom_imageA);
                         GET_ARGUMENT_C("postfixe=",nom_postfixe);
                         GET_ARGUMENT_C("imageB=""B=",nom_imageB);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);
                         GET_ARGUMENT_C("imageM=""M=",nom_imageM);
                         GET_ARGUMENT_I("premiere=",premiere_image);
                         GET_ARGUMENT_I("derniere=",derniere_image);
                         GET_ARGUMENT_I("pas=",pas_des_images);
                         GET_ARGUMENT_I("chiffres=",nombre_de_chiffres);
                         GET_ARGUMENT_F("facteur=""f=",facteur_multiplicatif_du_gradient);
                         GET_ARGUMENT_L("sens=""direct=",sens_direct);
                         GET_ARGUMENT_L("marquage=",marquer_les_points_atteints);
                         )
                    );

     SET_ECHANTILLONNAGE_DE_PROFONDEUR(SCAL(PasZ,DIVI(LENG(premiere_image,derniere_image),pas_des_images),dimZ));
                                        /* Mise en place du pas d'echantillonnage le long de 'OZ'.                                   */

     begin_nouveau_block
          Bblock
          BDEFV(imageJ,matrice_de_brouillage);
                                        /* Matrice de brouillage obtenue par "intergation" de la sequence Argument.                  */
          CALS(IJinitialisation_matrice_de_brouillage(matrice_de_brouillage));
                                        /* Initialisation de la matrice de "brouillage" (etat "neutre").                             */

          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA,nom_imageB))))
               Bblock
                                        /* 'ImageA' donne l'image a Brouiller.                                                       */
               DoIn(numero_d_image,premiere_image,derniere_image,pas_des_images)
                    Bblock
                    Test(IFNE(numero_d_image,fINTE(numero_d_image)))
                         Bblock
                         PRINT_ATTENTION("le numero de l'image courante n'est pas entier et va donc etre tronque");
                         Eblock
                    ATes
                         Bblock
                         Eblock
                    ETes

                    EGAL(nom_image
                        ,COND(IFEQ_chaine(nom_postfixe,NOM_UNDEF_VIDE)
                             ,chain_Aconcaten2_sauf_nom_pipe(nom_imageA
                                                            ,chain_numero_modulo(INTE(numero_d_image),nombre_de_chiffres)
                                                             )
                             ,chain_Aconcaten3_sauf_nom_pipe(nom_imageA
                                                            ,chain_numero_modulo(INTE(numero_d_image),nombre_de_chiffres)
                                                            ,nom_postfixe
                                                             )
                              )
                         );
                                        /* Le 20221212115105, 'chain_numero_modulo(...)' a remplace 'chain_numero(...)'...           */

                    Choi(REST(SOUS(numero_d_image,premiere_image),TROIS))
                         Bblock
                         Ca1e(ZERO)
                              Bblock
                              LOAD_AND_BROUILLE(ImageA2,ImageA3,ImageA1);
                                        /* Traitement des images (2,3,1).                                                            */
                              Eblock
                         ECa1

                         Ca1e(UN)
                              Bblock
                              LOAD_AND_BROUILLE(ImageA3,ImageA1,ImageA2);
                                        /* Traitement des images (3,1,2).                                                            */
                              Eblock
                         ECa1

                         Ca1e(DEUX)
                              Bblock
                              LOAD_AND_BROUILLE(ImageA1,ImageA2,ImageA3);
                                        /* Traitement des images (1,2,3).                                                            */
                              Eblock
                         ECa1

                         Defo
                              Bblock
                              PRINT_ERREUR("le reste a une valeur bizarre");
                              Eblock
                         EDef
                         Eblock
                    ECho

                    CALZ_FreCC(nom_image);
                    Eblock
               EDoI
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes

          CALS(Ibrouillage(ImageR,ImageA,matrice_de_brouillage,sens_direct,marquer_les_points_atteints));
                                        /* Et enfin, "brouillage" de l'image argument...                                             */
          CALi(Iupdate_image(nom_imageR,ImageR));

          Test(IL_FAUT(marquer_les_points_atteints))
               Bblock
               CALi(Iupdate_image(nom_imageM,Marqueur));
                                        /* Sauvegarde des points atteints...                                                         */
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          EDEFV(imageJ,matrice_de_brouillage);
                                        /* Matrice de brouillage obtenue par "integration" de la sequence Argument.                  */

          Eblock
     end_nouveau_block

     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.