/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " C R A Q U E L U R E "   D ' U N E   I M A G E  :                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Cette commande genere une image                                                                                */
/*                  dont le nom est le premier argument                                                                              */
/*                  d'appel ; elle est le resultat d'une                                                                             */
/*                  interpolation entre les deux images                                                                              */
/*                  Arguments. Lorsque :                                                                                             */
/*                                                                                                                                   */
/*                  imageA1 = BLANC,                                                                                                 */
/*                  imageA2 = un champ de points aleatoires                                                                          */
/*                            obtenu par 'random.02',                                                                                */
/*                                                                                                                                   */
/*                  imageR  = un champ de craquelure...                                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xci/craque$K' :                                                                                                */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 1988??????????).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*        :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

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ALPHA                                                                                                                         \
                    0.90                                                                                                                \
                                        /* Coefficient pour l'interpolation portant sur 'ImageA1',                                   */
#define   BETA_                                                                                                                         \
                    0.10                                                                                                                \
                                        /* Coefficient pour l'interpolation portant sur 'ImageA2'.                                   */

#define   NOMBRE_DE_POINTS                                                                                                              \
                    PARE(1024)                                                                                                          \
                                        /* Nombre de points maximal a traiter sur une spirale.                                       */
#define   OPTIMISER_LE_NOMBRE_DE_POINTS                                                                                                 \
                    VRAI                                                                                                                \
                                        /* Faut-il conserver 'NOMBRE_DE_POINTS' ('FAUX') ou optimiser afin d'etre sur de couvrir     */ \
                                        /* toute l'image ('VRAI') ? Ceci fut introduit le 20220120101417, la valeur par defaut       */ \
                                        /* garantissant la compatibilite anterieure...                                               */ \
                                        /*                                                                                           */ \
                                        /* Le 20220120122626 j'ai renonce a la compatibilite anterieure, l'optimisation etant        */ \
                                        /* associee a 's_arreter_sur_le_premier_point_hors_image=FAUX', ce qui permet d'obtenir      */ \
                                        /* des resultats "complets" et corrects...                                                   */

#define   DENORMALISER_LES_COORDONNEES_ARGUMENTS                                                                                        \
                    VRAI                                                                                                                \
                                        /* Faut-il ('VRAI') ou pas ('FAUX') denormaliser les coordonnees Arguments ?                 */
#define   NORMALISER_LES_COORDONNEES_RESULTATS                                                                                          \
                    VRAI                                                                                                                \
                                        /* Faut-il ('VRAI') ou pas ('FAUX') normaliser les coordonnees Resultats ?                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " C R A Q U E L U R E "   D ' U N E   I M A G E  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_imageR),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageRX),NOM_UNDEF_VIDE));
     DEFV(CHAR,INIC(POINTERc(nom_imageRY),NOM_UNDEF_VIDE));
     DEFV(CHAR,INIC(POINTERc(nom_imageA1),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageA2),NOM_PIPE));
     DEFV(CHAR,INIC(POINTERc(nom_imageAX),NOM_UNDEF_VIDE));
     DEFV(CHAR,INIC(POINTERc(nom_imageAY),NOM_UNDEF_VIDE));

     DEFV(Float,INIT(alpha,ALPHA));
                                        /* Coefficient pour l'interpolation portant sur 'ImageA1',                                   */
     DEFV(Float,INIT(beta_,BETA_));
                                        /* Coefficient pour l'interpolation portant sur 'ImageA2'.                                   */

     DEFV(Positive,INIT(nombre_de_points,NOMBRE_DE_POINTS));
                                        /* Nombre maximal de points a traiter sur une spirale.                                       */
     DEFV(Logical,INIT(optimiser_le_nombre_de_points,OPTIMISER_LE_NOMBRE_DE_POINTS));
                                        /* Faut-il conserver 'NOMBRE_DE_POINTS' ('FAUX') ou optimiser afin d'etre sur de couvrir     */
                                        /* toute l'image ('VRAI') ? Ceci fut introduit le 20220120101417, la valeur par defaut       */
                                        /* garantissant la compatibilite anterieure...                                               */
                                        /*                                                                                           */
                                        /* Le 20220120122626 j'ai renonce a la compatibilite anterieure, l'optimisation etant        */
                                        /* associee a 's_arreter_sur_le_premier_point_hors_image=FAUX', ce qui permet d'obtenir      */
                                        /* des resultats "complets" et corrects...                                                   */

     DEFV(Logical,INIT(denormaliser_les_coordonnees_Arguments,DENORMALISER_LES_COORDONNEES_ARGUMENTS));
                                        /* Faut-il ('VRAI') ou pas ('FAUX') denormaliser les coordonnees Arguments ?                 */
     DEFV(Logical,INIT(normaliser_les_coordonnees_Resultats,NORMALISER_LES_COORDONNEES_RESULTATS));
                                        /* Faut-il ('VRAI') ou pas ('FAUX') normaliser les coordonnees Resultats ?                   */
     /*..............................................................................................................................*/
     EGAL(Niveau____hors_image,BLANC);
                                        /* Valeur par defaut plus logique introduite le 20220118172109...                            */
     EGAL(Iassociation_de_voisinage_____s_arreter_sur_le_premier_point_hors_image,FAUX);
                                        /* Valeur par defaut plus logique introduite le 20220120122626...                            */

     GET_ARGUMENTSi(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_L("Iassociation_de_voisinage_____compatibilite_20101012=""compatibilite_20101012="
                                       ,Iassociation_de_voisinage_____compatibilite_20101012
                                        );
                                        /* Introduit le 20101012224103 et complete le 20120911134852...                              */
                         GET_ARGUMENT_L("Iassociation_de_voisinage_____compatibilite_20120421=""compatibilite_20120421="
                                       ,Iassociation_de_voisinage_____compatibilite_20120421
                                        );
                                        /* Argument introduit le 20120427112404 et complete le 20120911134852...                     */

                         GET_ARGUMENT_C("imageA1=""A1=",nom_imageA1);
                         GET_ARGUMENT_C("imageA2=""A2=",nom_imageA2);
                         GET_ARGUMENT_C("imageAX=""AX=",nom_imageAX);
                         GET_ARGUMENT_C("imageAY=""AY=",nom_imageAY);
                         GET_ARGUMENT_C("imageR=""R=",nom_imageR);
                         GET_ARGUMENT_C("imageRX=""RX=",nom_imageRX);
                         GET_ARGUMENT_C("imageRY=""RY=",nom_imageRY);

                         GET_ARGUMENT_L("accelerer_association=""accelerer=""acc="
                                       ,Iassociation_de_voisinage_____accelerer_l_association
                                        );
                                        /* Arguments introduits le 20120427112404...                                                 */
                         GET_ARGUMENT_I("pas_accelerateur=""paccelerateur=""pacc="
                                       ,Iassociation_de_voisinage_____pas_de_parcours_de_l_accelerateur
                                        );
                                        /* Arguments introduits le 20120427112404...                                                 */

                         GET_ARGUMENT_L("valider_compatibilite_images=""valider=""val="
                                       ,Iassociation_de_voisinage_____valider_la_compatibilite_des_images
                                        );
                                        /* Arguments introduits le 20101013105150...                                                 */

                         GET_ARGUMENT_L("arret_premier_point_hors_image=""arret_hors_image=""ahi="
                                       ,Iassociation_de_voisinage_____s_arreter_sur_le_premier_point_hors_image
                                        );
                         GET_ARGUMENT_N("explorer_hors_image=""hors_image=""ehi="
                                       ,Iassociation_de_voisinage_____s_arreter_sur_le_premier_point_hors_image
                                        );
                                        /* Arguments introduits le 20101013105150...                                                 */

                         GET_ARGUMENT_I("seuil_discrimination_niveaux=""seuil="
                                       ,Iassociation_de_voisinage_____seuil_de_discrimination_des_niveaux
                                        );
                                        /* Arguments introduits le 20101013113041...                                                 */

                         GET_ARGUMENT_F("alpha=""a=",alpha);
                         GET_ARGUMENT_F("beta=""b=",beta_);
                         GET_ARGUMENT_I("points=""n=",nombre_de_points);
                         GET_ARGUMENT_L("optimiser_points=""op=",optimiser_le_nombre_de_points);
                                        /* Argument introduit le 20220120101417...                                                   */
                         GET_ARGUMENT_L("Adenormaliser=",denormaliser_les_coordonnees_Arguments);
                         GET_ARGUMENT_L("Rnormaliser=",normaliser_les_coordonnees_Resultats);

                         GET_ARGUMENT_L("verifier_non_associations=""vna="
                                       ,Iassociation_de_voisinage_____verifier_les_non_associations
                                        );
                                        /* Arguments introduits le 20220120094854...                                                 */

                         GET_ARGUMENT_L("rn=""renorm=""renormaliser=""r="
                                       ,Iinterpolation_de_voisinage_____renormaliser_l_image_Resultat
                                        );
                                        /* Arguments introduits le 20220123140641...                                                 */
                         )
                    );
                                        /* On notera le 20101011170051 que 'GET_ARGUMENTSg(...)' n'est pas necessaire ici parce que  */
                                        /* les deux images 'Iassociation_de_voisinage_____X' et 'Iassociation_de_voisinage_____Y'    */
                                        /* sont referencees explicitement un peu plus loin...                                        */

     Test(IFNE(ADD2(alpha,beta_),FU))
                                        /* Test introduit le 20220123130027...                                                       */
          Bblock
          PRINT_ATTENTION("la somme alpha+beta n'est pas egale a 1");
                                        /* Ce probleme a ete rencontre a cette date lors de la mise au point de 'v $xiirk/CRAQ.23'   */
                                        /* en essayant :                                                                             */
                                        /*                                                                                           */
                                        /*                  set       _____Alpha=0.83                                                */
                                        /*                  set       _____Beta=0.17                                                 */
                                        /*                                                                                           */
                                        /* dans 'v $xiirk/$Fnota Debut_listG_CRAQ_23'...                                             */
                                        /*                                                                                           */
                                        /* Mais le 20220123134912, je note que le probleme n'etait pas dans cette somme, mais dans   */
                                        /* l'interpolation 'v $xiii/$xiii/tri_image$FON 20220123133744'...                           */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     CALi(Inoir(ImageR));
                                        /* Initialisation de l'image Resultat.                                                       */

     Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA1,nom_imageA1))))
          Bblock
                                        /* Chargement de la premiere image Argument.                                                 */
          Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA2,nom_imageA2))))
               Bblock
                                        /* Chargement de la deuxieme image Argument.                                                 */
               DEFV(Logical,INIT(faire_appel_a_Iassociation_de_voisinage,VRAI));
                                        /* A priori, il sera necessaire d'appeler 'Iassociation_de_voisinage(...)'.                  */

               Test(IL_FAUT(optimiser_le_nombre_de_points))
                    Bblock
                    EGAL(nombre_de_points,MUL2(DOUB(dimX),DOUB(dimY)));
                                        /* Avec cette initialisation introduite le 20220120101417, on est sur a partir de            */
                                        /* n'importe quel point {X,Y} d'une image d'atteindre un premier voisin (s'il existe         */
                                        /* evidemment...).                                                                           */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFET(IFNE_chaine(nom_imageAX,NOM_UNDEF_VIDE),IFNE_chaine(nom_imageAY,NOM_UNDEF_VIDE)))
                    Bblock
                    Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA1,nom_imageAX))))
                                        /* Chargement de l'image des associations en 'X'.                                            */
                         Bblock
                         Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA2,nom_imageAY))))
                                        /* Chargement de l'image des associations en 'Y'.                                            */
                              Bblock
                              EGAL(faire_appel_a_Iassociation_de_voisinage,FAUX);
                                        /* Les images {nom_imageAX,nom_imageAY} ont pu etre recuperees ; on ne fera donc pas appel   */
                                        /* a 'Iassociation_de_voisinage(...)'.                                                       */
                              Eblock
                         ATes
                              Bblock
                              Test__CODE_ERREUR__ERREUR07;
                              Eblock
                         ETes
                         Eblock
                    ATes
                         Bblock
                         Test__CODE_ERREUR__ERREUR07;
                         Eblock
                    ETes
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IL_FAUT(faire_appel_a_Iassociation_de_voisinage))
                    Bblock
                    CALS(Iassociation_de_voisinage(ImageA1,ImageA2,nombre_de_points));
                                        /* Calcul de {Iassociation_de_voisinage_____X,Iassociation_de_voisinage_____Y}               */
                                        /* par la methode d'association de voisinage...                                              */
                    Eblock
               ATes
                    Bblock
                    Test(IL_FAUT(denormaliser_les_coordonnees_Arguments))
                         Bblock
                         begin_image
                              Bblock
                              storeI_point(_cDENORMALISE_OX(loadF_point(IFmageA1,X,Y)),Iassociation_de_voisinage_____X,X,Y);
                              storeI_point(_cDENORMALISE_OY(loadF_point(IFmageA2,X,Y)),Iassociation_de_voisinage_____Y,X,Y);
                                        /* Initialisation de {Iassociation_de_voisinage_____X,Iassociation_de_voisinage_____Y}       */
                                        /* arbitraire avec denormalisation, les coordonnees dans {IFmageA1,IFmageA2} etant           */
                                        /* supposees dans [0,1]...                                                                   */
                              Eblock
                         end_image
                         Eblock
                    ATes
                         Bblock
                         CALS(Ifloat_int(Iassociation_de_voisinage_____X,IFmageA1));
                         CALS(Ifloat_int(Iassociation_de_voisinage_____Y,IFmageA2));
                                        /* Initialisation de {Iassociation_de_voisinage_____X,Iassociation_de_voisinage_____Y}       */
                                        /* arbitraire sans denormalisation...                                                        */
                         Eblock
                    ETes

                    Iassociation_de_voisinage_____X_association__ET__Y_association__SONT_INITIALISEES;
                                        /* Et ainsi, on fait comme si 'Iassociation_de_voisinage(...)' avait ete utilise...          */
                    Eblock
               ETes

               CALS(Iinterpolation_de_voisinage(ImageR,alpha,ImageA1,beta_,ImageA2,VRAI,LUNDEF));
                                        /* Et interpolation entre les deux images.                                                   */
                                        /*                                                                                           */
                                        /* Le 20220118173131, l'argument 'LUNDEF' a ete introduit, mais il est en fait inutile...    */

               CALi(Iupdate_image(nom_imageR,ImageR));

               Test(IFNE_chaine(nom_imageRX,NOM_UNDEF_VIDE))
                    Bblock
                    Test(IL_FAUT(normaliser_les_coordonnees_Resultats))
                         Bblock
                         begin_image
                              Bblock
                              storeF_point(_____cNORMALISE_OX(loadI_point(Iassociation_de_voisinage_____X,X,Y)),IFmageA1,X,Y);
                              Eblock
                         end_image
                         Eblock
                    ATes
                         Bblock
                         CALS(Iint_float(IFmageA1,Iassociation_de_voisinage_____X));
                         Eblock
                    ETes

                    CALi(IupdateF_image(nom_imageRX,IFmageA1));
                                        /* Sauvegarde de 'Iassociation_de_voisinage_____X' si cela est demande avec ou sans          */
                                        /* normalisation...                                                                          */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               Test(IFNE_chaine(nom_imageRY,NOM_UNDEF_VIDE))
                    Bblock
                    Test(IL_FAUT(normaliser_les_coordonnees_Resultats))
                         Bblock
                         begin_image
                              Bblock
                              storeF_point(_____cNORMALISE_OY(loadI_point(Iassociation_de_voisinage_____Y,X,Y)),IFmageA2,X,Y);
                              Eblock
                         end_image
                         Eblock
                    ATes
                         Bblock
                         CALS(Iint_float(IFmageA2,Iassociation_de_voisinage_____Y));
                         Eblock
                    ETes

                    CALi(IupdateF_image(nom_imageRY,IFmageA2));
                                        /* Sauvegarde de 'Iassociation_de_voisinage_____Y' si cela est demande avec ou sans          */
                                        /* normalisation...                                                                          */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          ATes
               Bblock
               Test__CODE_ERREUR__ERREUR07;
               Eblock
          ETes
          Eblock
     ATes
          Bblock
          Test__CODE_ERREUR__ERREUR07;
          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.