/*************************************************************************************************************************************/
/* */
/* I N T E R P O L A T I O N E N T R E D E U X I M A G E S S U I V A N T U N */
/* P O N D E R A T E U R A P P L I Q U E A U X T R A N S F O R M E E S D E F O U R I E R : */
/* */
/* */
/* Definition : */
/* */
/* Cette commande genere une image */
/* dont le nom est le premier argument */
/* d'appel ; elle est le resultat de */
/* l'interpolation entre les deux images */
/* Arguments suivant un Ponderateur et */
/* son complement, l'interpolation etant */
/* realise dans l'espace de Fourier. */
/* */
/* En notant '*' le produit terme a */
/* terme de deux matrices complexes, le */
/* le resultat de cette commande est */
/* l'image : */
/* */
/* -1 ----- */
/* TF [(TF(image1)*TF(noyau)) + (TF(image2)*TF(noyau))] */
/* */
/* ou 'image?' et 'noyau' designent les deux */
/* images a interpoler et le noyau respectivement, */
/* ou (suivant les options) : */
/* */
/* -1 */
/* TF [(TF(image1)*TF(noyau1)) + (TF(image2)*TF(noyau2))] */
/* */
/* ou 'image?' et 'noyau?' designent les deux */
/* images a interpoler et les deux noyaux respectivement, */
/* */
/* Dans tous les cas, et particulierement dans */
/* le second, il conviendra de faire tres attention */
/* a la notion d'etalement de filtre qui est a priori */
/* a l'etat 'VRAI' et qui risque donc de faire */
/* s'evanouir completement un filtre si tous ses */
/* niveaux sont inferieur au seuil associe ('GRIS_7' */
/* implicitement...). */
/* */
/* */
/* Exemple : */
/* */
/* La commande : */
/* */
/* $xci/interpole.03$X A1=... A2=... P=$BLANC R=... $formatI */
/* */
/* donne a 'R' la valeur 'A1', alors que : */
/* */
/* $xci/interpole.03$X A1=... A2=... P=$NOIR R=... $formatI */
/* */
/* donne a 'R' la valeur 'A2'. */
/* */
/* */
/* Author of '$xci/interpole.03$K' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1994??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* 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_IMAGESF_EXT
#include image_image_IMAGESJ_EXT
#include maths_trans_FOURIER_EXT
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R E S : */
/* */
/*************************************************************************************************************************************/
#include xci/filtre.01.I"
#define LES_DEUX_FILTRES_SONT_COMPLEMENTAIRES \
VRAI \
/* Indique s'il les deux filtres sont complementaires ('VRAI') ou pas ('FAUX'), auquel cas, */ \
/* il faut en donner deux en Argument... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* I N T E R P O L A T I O N E N T R E D E U X I M A G E S S U I V A N T U N */
/* P O N D E R A T E U R A P P L I Q U E A U X T R A N S F O R M E E S D E F O U R I E R : */
/* */
/*************************************************************************************************************************************/
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(CHAR,INIC(POINTERc(nom_imageP1),NOM_PIPE));
DEFV(CHAR,INIC(POINTERc(nom_imageP2),NOM_PIPE));
#include xci/filtre.03.I"
DEFV(Logical,INIT(les_deux_filtres_sont_complementaires,LES_DEUX_FILTRES_SONT_COMPLEMENTAIRES));
/* Indique s'il les deux filtres sont complementaires ('VRAI') ou pas ('FAUX'), auquel cas, */
/* il faut en donner deux en Argument... */
/*..............................................................................................................................*/
GET_ARGUMENTSi(nombre_d_arguments
,BLOC(GET_ARGUMENT_C("imageA1=""A1=",nom_imageA1);
GET_ARGUMENT_C("imageA2=""A2=",nom_imageA2);
GET_ARGUMENT_C("imageP=""imageP1=""P=""P1=",nom_imageP1);
GET_ARGUMENT_C("imageP2=""P2=",nom_imageP2);
GET_ARGUMENT_C("imageR=""R=",nom_imageR);
GET_ARGUMENT_C("imageA1:A=""A1:A=",nom_imageA1);
GET_ARGUMENT_C("imageA2:A=""A2:A=",nom_imageA2);
GET_ARGUMENT_C("imageP:A=""imageP1:A=""P:A=""P1:A=",nom_imageP1);
GET_ARGUMENT_C("imageP2:A=""P2:A=",nom_imageP2);
GET_ARGUMENT_C("imageR:R=""R:R=",nom_imageR);
/* Les separateurs ":A=" et ":R= ont ete introduits le 20060309190402 afin de pouvoir */
/* etre utilises en conjonction avec 'v $xci/ExecSdu$vv$Z SePaRaTeUr_1_.'. */
/* */
/* Le 20060311115559 je note que grace a 'v $xcc/cpp$Z 20060310172649' la definition des */
/* parametres utilisant les separateurs ":A=" et ":R= ne sont plus utiles. Malgre cela, */
/* ils sont conserves a titre demonstratif, unique et exceptionnel... */
GET_ARGUMENT_L("standardA=",les_imagesA_sont_standards);
/* Introduit le 20060309094449... */
GET_ARGUMENT_L("standardR=""standard=",les_imagesR_sont_standards);
/* 'les_images_sont_standards' fut remplace par 'les_imagesR_sont_standards' le */
/* 20060307135256 a cause de 'v $xci/filtre.01$K les_images._sont_standards'. Au passage, */
/* la logique voudrait que l'on supprime le parametre "standard=" (qui fut donc remplace */
/* a cette date par "standardR="), mais cela impliquerait trop de modifications un peu */
/* partout ; d'ou cette solution de facilite... */
GET_ARGUMENT_L("complementaires=",les_deux_filtres_sont_complementaires);
GET_ARGUMENT_L("etaler=",etaler_le_filtre);
GET_ARGUMENT_I("seuil=""s=",seuil_d_etalement_du_filtre);
GET_ARGUMENT_L("binariser=",binariser_le_filtre);
GIT_ARGUMENT_F("trx=""trX=",translation_OX,_____lNORMALISE_OX(X_TRANSLATION));
GIT_ARGUMENT_F("try=""trY=",translation_OY,_____lNORMALISE_OY(Y_TRANSLATION));
GET_ARGUMENT_L("rn=""renormaliser=",renormaliser_l_image);
GET_ARGUMENT_L("tronquer=",tronquer_les_niveaux);
)
);
Test(I4ET(IFEQ(dimX,dimY)
,EST_UNE_PUISSANCE_DE_2(dimX)
,EST_UNE_PUISSANCE_DE_2(dimY)
,IFEQ(pasX,pasY)
)
)
/* Ce test fut introduit le 20060313101116... */
Bblock
Test(EST_VRAI(les_imagesA_sont_standards))
Bblock
Eblock
ATes
Bblock
Test(EST_VRAI(les_imagesR_sont_standards))
Bblock
PRINT_ERREUR("les options 'standardA=' et 'standardR=' ne sont pas utilisees correctement");
CAL1(Prer2("(l'utilisation de 'standardA=%s' necessite 'standardR=%s' qui est donc force)\n"
,ETAT_LOGIQUE(NEUL(les_imagesA_sont_standards))
,ETAT_LOGIQUE(NOTL(les_imagesR_sont_standards))
)
);
EGAL(les_imagesR_sont_standards,FAUX);
Eblock
ATes
Bblock
Eblock
ETes
Eblock
ETes
CALi(gInettoyage(les_imagesR_sont_standards,ImageR,IFmage_PR));
/* Initialisation de l'image Resultat. */
INITIALISATION_ACCROISSEMENT_2D(translation,translation_OX,translation_OY);
/* Definition de la translation sur le Ponderateur. */
Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards,ImageA1,IFmageA1,nom_imageA1))))
Bblock
/* Chargement de la premiere image Argument. */
Test(PAS_D_ERREUR(CODE_ERROR(gIload_image(les_imagesA_sont_standards,ImageA2,IFmageA2,nom_imageA2))))
Bblock
/* Chargement de la deuxieme image Argument. */
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA4,nom_imageP1))))
/* Chargement de l'image de definition de la Ponderation : */
/* A4 = filtre utilise ('noyau1'). */
Bblock
BDEFV(imageJ,transformee_de_fourier_1_ou_2_avant_filtrage);
/* Image complexe contenant une transformee de Fourier complexe avant filtrage. */
BDEFV(imageJ,transformee_de_fourier_1_apres_filtrage);
BDEFV(imageJ,transformee_de_fourier_2_apres_filtrage);
/* Image complexe contenant les transformees de Fourier complexes apres filtrage. */
Test(EST_VRAI(les_deux_filtres_sont_complementaires))
Bblock
CALS(Icomplementation(ImageA3,ImageA4));
/* A3 = filtre complementaire utilise ('noyau2'). */
Eblock
ATes
Bblock
Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA3,nom_imageP2))))
Bblock
/* A3 = filtre utilise ('noyau2'). */
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ETes
Test(IL_FAUT(etaler_le_filtre))
Bblock
#include xci/filtre.04.I"
SET_FILTRAGE(ACTIF);
CALS(Imove(ImageA3,ImageA3));
CALS(Imove(ImageA4,ImageA4));
/* Etalement des deux filtres 'noyau1' ('ImageA4') et 'noyau2' ('ImageA3'). */
SET_FILTRAGE(INACTIF);
Eblock
ATes
Bblock
/* Rien a faire... */
Eblock
ETes
Test(IFEQ(Inivo_maximum(ImageA4),NOIR))
Bblock
PRINT_ATTENTION("le filtre 'P1' est completement 'NOIR'");
/* Il faut peut-etre agir alors sur 'etaler_le_filtre' et 'seuil_d_etalement_du_filtre'. */
Eblock
ATes
Bblock
Eblock
ETes
Test(IFEQ(Inivo_maximum(ImageA3),NOIR))
Bblock
PRINT_ATTENTION("le filtre 'P2' est completement 'NOIR'");
/* Il faut peut-etre agir alors sur 'etaler_le_filtre' et 'seuil_d_etalement_du_filtre'. */
Eblock
ATes
Bblock
Eblock
ETes
Test(EST_VRAI(les_imagesA_sont_standards))
Bblock
CALS(Istd_float(IFmage_PR,FLOT__NOIR,FLOT__BLANC,ImageA1));
CALS(Istd_float(IFmage_PI,FLOT__NOIR,FLOT__BLANC,ImageR));
Eblock
ATes
Bblock
CALS(IFmove(IFmage_PR,IFmageA1));
CALi(IFinitialisation(IFmage_PI,FZERO));
/* Possibilite introduite le 20060309095201... */
Eblock
ETes
CALS(Ireelle_complexe(IJmageA,IFmage_PR));
CALS(Iimaginaire_complexe(IJmageA,IFmage_PI));
/* Generation de l'image Argument 1 complexe a transformer avec {ImageA1,NOIR}. */
CALS(IJfourier_2D_directe_complexe(transformee_de_fourier_1_ou_2_avant_filtrage,IJmageA));
/* On fait la transformee directe, */
CALS(IJfiltrage(transformee_de_fourier_1_apres_filtrage
,transformee_de_fourier_1_ou_2_avant_filtrage
,ImageA4
,ADRESSE(translation)
)
);
/* Filtrage par le Ponderateur "etale". */
Test(EST_VRAI(les_imagesA_sont_standards))
Bblock
CALS(Istd_float(IFmage_PR,FLOT__NOIR,FLOT__BLANC,ImageA2));
CALS(Istd_float(IFmage_PI,FLOT__NOIR,FLOT__BLANC,ImageR));
Eblock
ATes
Bblock
CALS(IFmove(IFmage_PR,IFmageA2));
CALi(IFinitialisation(IFmage_PI,FZERO));
/* Possibilite introduite le 20060309095201... */
Eblock
ETes
CALS(Ireelle_complexe(IJmageA,IFmage_PR));
CALS(Iimaginaire_complexe(IJmageA,IFmage_PI));
/* Generation de l'image Argument 2 complexe a transformer avec {ImageA2,NOIR}. */
CALS(IJfourier_2D_directe_complexe(transformee_de_fourier_1_ou_2_avant_filtrage,IJmageA));
/* On fait la transformee directe, */
CALS(IJfiltrage(transformee_de_fourier_2_apres_filtrage
,transformee_de_fourier_1_ou_2_avant_filtrage
,ImageA3
,ADRESSE(translation)
)
);
/* Filtrage par le Ponderateur "etale" et complemente. */
#define somme_des_transformees_de_fourier_1_ou_2_apres_filtrage \
transformee_de_fourier_1_ou_2_avant_filtrage
CALS(IJaddition_complexe(somme_des_transformees_de_fourier_1_ou_2_apres_filtrage
,transformee_de_fourier_1_apres_filtrage
,transformee_de_fourier_2_apres_filtrage
)
);
/* On fait la somme des deux transformees de Fourier. */
CALS(IJfourier_2D_inverse_complexe(IJmageR,somme_des_transformees_de_fourier_1_ou_2_apres_filtrage));
/* Puis la transformee inverse. */
#include xci/filtre.05.I"
CALi(gIupdate_image(les_imagesR_sont_standards,nom_imageR,ImageR,IFmage_PR));
EDEFV(imageJ,transformee_de_fourier_2_apres_filtrage);
EDEFV(imageJ,transformee_de_fourier_1_apres_filtrage);
/* Image complexe contenant les transformees de Fourier complexes apres filtrage. */
EDEFV(imageJ,transformee_de_fourier_1_ou_2_avant_filtrage);
/* Image complexe contenant une transformee de Fourier complexe avant filtrage. */
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
Test__CODE_ERREUR__ERREUR07;
Eblock
ETes
Eblock
ATes
Bblock
DEFV(CHAR,INIT(POINTERc(commande_courante),CHAINE_UNDEF));
RECONSTITUTION_DE_LA_COMMANDE_COURANTE(commande_courante);
/* Recuperation du nom de la commande courante avec tous ses arguments... */
EXECUTION_D_UNE_SUITE_DE_COMMANDES_SOUS_SH(chain_Aconcaten3(GENERATION_NOM_D_UNE_COMMANDE_Z(Direct_xci
,chain_Aconcaten2("ExecSdu"
,GvarDefaut("vv"
,".vv"
)
)
)
,C_BLANC
,commande_courante
)
);
/* Et enfin, execution de la commande courante en mode 'Sdu' (introduit le 20060313101413). */
Eblock
ETes
RETU_Commande;
Eblock
ECommande