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