#!/bin/csh

#######################################################################################################################################
#                                                                                                                                     #
#         T R A N S F O R M E E   E N   O N D E L E T T E S   D ' U N E   I M A G E   " C H A M P "                                   #
#         D A N S   S O N   D I R E C T O R Y  :                                                                                      #
#                                                                                                                                     #
#                                                                                                                                     #
#         Utilisation :                                                                                                               #
#                                                                                                                                     #
#                             $xci/ondes.03$Z     <sous_nom_de_l_ondelette> <palette> [Ty=<Ty_montagnes.Mp>] [Ty=<Ty_montagnes.Mn>]   #
#                                                                                                                                     #
#                   ou la syntaxe de 'sous_nom_de_l_ondelette' est donne dans le nota de $xiio,                                       #
#                   et 'palette' est du type "$xiP/nom", et en general : Ty(Mn) = Ty(Mp) + 0.5,                                       #
#                   le '0.5' correspondant a 'COULEURS/dimY' qui est une translation permettant de                                    #
#                   mettre les montagnes negatives au meme niveau que les montagnes positives                                         #
#                   (par exemple, pour '$xiio/FRAC2.090.N', on prendra : 'Ty=0.5 Ty=1.0').                                            #
#                                                                                                                                     #
#                                                                                                                                     #
#         Principe :                                                                                                                  #
#                                                                                                                                     #
#                     La transformee en ondelettes de la                                                                              #
#                   fonction 'f' s'obtient en fait en faisant                                                                         #
#                   le produit de convolution '*' de 'f' par                                                                          #
#                   l'ondelette 'M', soit :                                                                                           #
#                                                                                                                                     #
#                                       f*M                                                                                           #
#                                                                                                                                     #
#                   or, 'TF' designant la transformee de                                                                              #
#                   Fourier, on sait que :                                                                                            #
#                                                                                                                                     #
#                                       TF(f1*f2) = TF(f1).TF(f2)                                                                     #
#                                                                                                                                     #
#                   ou '.' designe le produit terme a terme                                                                           #
#                   de deux matrices complexes.                                                                                       #
#                                                                                                                                     #
#                   En prenant la transformee de Fourier                                                                              #
#                   inverse de l'identite precedente, on a :                                                                          #
#                                                                                                                                     #
#                                         -1                -1                                                                        #
#                                       TF  (TF(f1*f2)) = TF  (TF(f1).TF(f2))                                                         #
#                                                                                                                                     #
#                   soit :                                                                                                            #
#                                                                                                                                     #
#                                                 -1                                                                                  #
#                                       f1*f2 = TF  (TF(f1).TF(f2))                                                                   #
#                                                                                                                                     #
#                   Appliquee a la transformee en ondelettes,                                                                         #
#                   on a donc :                                                                                                       #
#                                                                                                                                     #
#                                               -1                                                                                    #
#                                       f*M = TF  (TF(f).TF(M))                                                                       #
#                                                                                                                                     #
#                   Pour calculer la transformee en ondelettes                                                                        #
#                   de 'f' par 'M', on calcule donc la transformee                                                                    #
#                   de Fourier de la fonction 'f', soit TF(f),                                                                        #
#                   on precalcule (c'est-a-dire qu'en general elle                                                                    #
#                   est calculee une fois pour toute) la transformee                                                                  #
#                   de Fourier TF(M) de l'ondelette 'M' (notons                                                                       #
#                   qu'au passage, c'est en fait 'M(a,b)', puisque                                                                    #
#                   l'ondelette depend de deux parametres) ; on                                                                       #
#                   fait ensuite leur produit terme a terme,                                                                          #
#                   soit 'TF(f).TF(M)', puis enfin, on calcule                                                                        #
#                   la transformee de  Fourier inverse de ce                                                                          #
#                   produit, ce qui donne la transformee cherchee...                                                                  #
#                                                                                                                                     #
#                                                                                                                                     #
#         Note sur la periodicite :                                                                                                   #
#                                                                                                                                     #
#                     La transformee de Fourier demande a ce                                                                          #
#                   que le champ soit periodique dans les deux                                                                        #
#                   directions ; si ce n'est pas le cas, une                                                                          #
#                   solution simple consiste a le symetriser                                                                          #
#                   doublement par '$xci/kaleidoscope$X', et                                                                          #
#                   a faire, sur la mosaique doublement symetrique                                                                    #
#                   obtenue, la transformee en ondelettes, mais avec                                                                  #
#                   une resolution deux fois moindre suivant chaque                                                                   #
#                   direction. Alors on n'oubliera pas que l'echelle                                                                  #
#                   de l'ondelette doit changer elle aussi (reduction                                                                 #
#                   de moitie : passage de '120615' a '060615' par                                                                    #
#                   exemple).                                                                                                         #
#                                                                                                                                     #
#                                                                                                                                     #
#         Author of '$xci/ondes.03$Z' :                                                                                               #
#                                                                                                                                     #
#                     Jean-Francois Colonna (LACTAMME, AAAAMMJJhhmmss).                                                               #
#                                                                                                                                     #
#######################################################################################################################################

set                 ondelette=$1
set                 palette=$2
set                 Atranslation_Mp=$3
                                        # Translation verticale des montagnes positives '$Mp'.                                        #
set                 Atranslation_Mn=$4
                                        # Translation verticale des montagnes negatives '$Mn'.                                        #

set                 CHAMPa=$CWD/$CHAMP
                                        # Nom de l'image dont on veut la transformee en ondelettes dans le directory courant.         #
set                 MORLr=$MORLET$K_sepP
                                        # Racine relative du nom des images contenant un champ de Morlet.                             #
set                 MORLa=$xiio/$MORLr
                                        # Racine absolue du nom des images contenant un champ de Morlet.                              #
set                 BINARISATION=224
                                        # Seuil de binarisation (en general 32 pour avoir la phase suivant des lignes                 #
                                        # NOIR ou 224 pour l'avoir en BLANC).                                                         #

set                 Tdirec=$CWD/$MORLr$ondelette$D
                                        # Nom du directory ou mettre la transformee.                                                  #
$MKDIR              $Tdirec                                                                                             >& $nul
                                        # Creation du directory ou mettre la transformee.                                             #
set                 Pdirec=$Tdirec/$PRODUIT$Mo$Ph$D
                                        # Nom du directory ou construire les representations de la transformee en ondelettes.         #

if   (-e $Pdirec/$CHAMP) then
else

#######################################################################################################################################
#                                                                                                                                     #
#         D E B U T   D U   " C O E U R "   D U   P R O C E S S U S  :                                                                #
#                                                                                                                                     #
#######################################################################################################################################

     if             (-e $CHAMPa$TF) then
     else
                    $xci/fftds$Z        $CHAMPa $NOIR $CHAMPa FAUX $NEXIST
                                        # Lorsque le champ n'a pas encore de Transformee de Fourier, on lui calcule.                  #
     endif

     if             (-e $MORLa$ondelette$TF) then
                    $xci/fftp$Z         $CHAMPa $MORLa$ondelette $Tdirec/
                                        # Calcul du produit de la transformee de Fourier du champ et de celle de l'ondelette.         #
     else
                    FileTmpB            nomTF

                    $xci/fftds$Z        $MORLa$ondelette$PR $MORLa$ondelette$PI $nomTF FAUX $NEXIST
                                        # Calcul de la transformee de Fourier de l'ondelette qui ne pre-existait pas...               #

                    $xci/fftp$Z         $CHAMPa $nomTF $Tdirec/
                                        # Calcul du produit de la transformee de Fourier du champ et de celle de l'ondelette.         #

                    FileTmpE            nomTF
     endif

     $xci/ffti$Z         $Tdirec/                                                                                           >& $nul
                                        # Calcul de la transformee de Fourier inverse, ce qui donne la transformee en ondelettes.     #

#######################################################################################################################################
#                                                                                                                                     #
#         F I N   D U   " C O E U R "   D U   P R O C E S S U S  :                                                                    #
#                                                                                                                                     #
#######################################################################################################################################

     $DELETE_VALIDE      $Tdirec/$TF
                                        # Destruction de la transformee de Fourier.                                                   #
     $DELETE_VALIDE      $Tdirec/$J
                                        # Destruction de la transformee en ondelettes complexe (on ne garde que les images            #
                                        # standards correspondant a la partie Reelle, a la partie Imaginaire, au Module et            #
                                        # a la Phase).                                                                                #

     $MKDIR              $Pdirec                                                                                            >& $nul
                                        # Creation du directory ou construire les representations de la transformee en ondelettes.    #
     $xci/passe_bande$X  A=$Tdirec/$Mo R=$Pdirec/$Mo $formatI
                                        # Suppression du NOIR dans le Module, puis du BLANC afin que la Phase apparaisse clairement.  #
     $xci/seuil$X        A=$Tdirec/$Ph R=$Pdirec/$Ph seuil=$BINARISATION $formatI
                                        # Binarisation de la Phase [NOIR,seuil-1],[seuil,BLANC].                                      #
     if   ($BINARISATION <= $GRIS) then
          $xci/minimum$X      A1=$Pdirec/$Mo A2=$Pdirec/$Ph R=$Pdirec/$CHAMP $formatI
                                        # "Produit" entre le Module et la Phase qui va apparaitre en lignes NOIR.                     #
     else
          $xci/maximum$X      A1=$Pdirec/$Mo A2=$Pdirec/$Ph R=$Pdirec/$CHAMP $formatI
                                        # "Produit" entre le Module et la Phase qui va apparaitre en lignes BLANC.                    #
     endif
     $xci/passe_bande$X  A=$Pdirec/$CHAMP R=$Pdirec/$CHAMP sup=$BLANC $formatI
                                        # On elimine le NOIR afin de faciliter les mappings 3D.                                       #
     $DELETE_VALIDE      $Pdirec/$Mo
                                        # Nettoyage.                                                                                  #
     $DELETE_VALIDE      $Pdirec/$Ph
                                        # Nettoyage.                                                                                  #
endif


$xci/vraies_C$X     A=$Pdirec/$CHAMP p=$palette RR=$Pdirec/$CHAMP$ROUGE RV=$Pdirec/$CHAMP$VERTE RB=$Pdirec/$CHAMP$BLEUE $formatI
                                        # Recuperation des trois composantes 'RVB' de la texture.                                     #

set  NP=$K_VIDE
                                        # Pour caracteriser la palette avec laquelle vont etre faits les mappings.                    #

set                 depth='depth=FAUX'
                                        # Pour ne pas avoir de depth-cueing.                                                          #
set                 depth='depth=VRAI min=0.50'
                                        # Pour avoir du depth-cueing.                                                                 #
set                 avion='avion=FAUX alias=VRAI'
                                        # Pour faire une vue de cote.                                                                 #
set                 translation="Ty=0.60 $Atranslation_Mp"
                                        # Pour translater verticalement l'image.                                                      #
set                 echelle='echelle=1.0'
                                        # Pour construire les montagnes "positives".                                                  #
$xci/stereo_pair$Z  $CHAMPa $CHAMPa
                                        # Generation de la paire stereoscopique du champ.                                             #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
                    "$xci/stereo_pair$Z $Pdirec/$CHAMP"'$n'" $Pdirec/$CHAMP"'$n'""
                                        # Generation des paires stereoscopiques du couple (module,phase).                             #

set                 arguments="$echelle $depth $avion $translation"
                                        # Afin de raccourcir les qautre lignes "$xci/montagne.01$X ..." qui suivent...                #

$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
"$xci/montagne.01$X A=$CHAMPa$DROITE $arguments T=$Pdirec/$CHAMP"'$n'"$DROITE R=$Pdirec/$Mp$NP$DROITE"'$n'" $formatI"
                                        # Mise en montagne "positive" vue 'DROITE' ($Pdirec/$CHAMP$Mp$NP$DROITE$RVB)                  #
                                        # du champ argument avec une translation eventuellement imposee.                              #
                                        # ATTENTION : on ne peut mettre le deuxieme argument de '$xci/repeat.02$Z' sur deux lignes    #
                                        # car en effet, alors sa valeur en serait affectee...                                         #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
"$xci/montagne.01$X A=$CHAMPa$GAUCHE $arguments T=$Pdirec/$CHAMP"'$n'"$GAUCHE R=$Pdirec/$Mp$NP$GAUCHE"'$n'" $formatI"
                                        # Mise en montagne "positive" vue 'GAUCHE' ($Pdirec/$CHAMP$Mp$NP$DROITE$RVB)                  #
                                        # du champ argument avec une translation eventuellement imposee.                              #
                                        # ATTENTION : on ne peut mettre le deuxieme argument de '$xci/repeat.02$Z' sur deux lignes    #
                                        # car en effet, alors sa valeur en serait affectee...                                         #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
                    "$DELETE_VALIDE     $Pdirec/$CHAMP"'$n'"$DROITE"
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
                    "$DELETE_VALIDE     $Pdirec/$CHAMP"'$n'"$GAUCHE"
                                        # Nettoyage.                                                                                  #
$xci/repeat.02$Z    "$DROITE $GAUCHE"                                                                                                   \
                    "$DELETE_VALIDE     $CHAMPa"'$n'""
                                        # Nettoyage.                                                                                  #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
"$xci/montagne.01$X A=$CHAMPa $arguments T=$Pdirec/$CHAMP"'$n'" R=$Pdirec/$Mp$NP"'$n'" $formatI"
                                        # Mise en montagne "positive" ($Pdirec/$CHAMP$Mp$NP$RVB) du champ argument                    #
                                        # avec une translation eventuellement imposee.                                                #
set                 translation="Ty=1.10 $Atranslation_Mn"
                                        # Pour translater verticalement l'image.                                                      #
set                 echelle='echelle=-1.0'
                                        # Pour construire les montagnes "negatives".                                                  #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
"$xci/montagne.01$X A=$CHAMPa $arguments T=$Pdirec/$CHAMP"'$n'" R=$Pdirec/$Mn$NP"'$n'" $formatI"
                                        # Mise en montagne "negative" ($Pdirec/$CHAMP$Mn$NP$RVB) du champ argument                    #
                                        # avec une translation eventuellement imposee.                                                #

set                 avion='avion=VRAI alias=FAUX depth=FAUX'
                                        # Pour faire une vue d'avion.                                                                 #
set                 echelle='echelle=1.0'
                                        # Pour construire les montagnes "positives".                                                  #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
"$xci/montagne.01$X A=$CHAMPa $echelle T=$Pdirec/$CHAMP"'$n'" R=$Pdirec/$mp$NP"'$n'" $avion $formatI"
                                        # Mise en montagne "positive" ($Pdirec/$CHAMP$mp$NP$RVB) du champ argument.                   #
set                 echelle='echelle=-1.0'
                                        # Pour construire les montagnes "negatives".                                                  #
$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
"$xci/montagne.01$X A=$CHAMPa $echelle T=$Pdirec/$CHAMP"'$n'" R=$Pdirec/$mn$NP"'$n'" $avion $formatI"
                                        # Mise en montagne "negative" ($Pdirec/$CHAMP$mn$NP$RVB) du champ argument.                   #

$xci/repeat.02$Z    "$ROUGE $VERTE $BLEUE"                                                                                              \
                    "$DELETE_VALIDE     $Pdirec/$CHAMP"'$n'""
                                        # Nettoyage.                                                                                  #



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.