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