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