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