#!/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. #