Un logi iel de traitement d'image
[Projet RACE℄
Do umentation editee par Mar Van Droogenbroe k
Le logi iel Xlim3D est le fruit du travail de plusieurs her heurs du Centre de Morphologie
Mathematique de Fontainebleau. Au depart, ha undeveloppait espropres fon tions mais,
auldu temps,il devient indispensabled'integrer esparties pourpermettrea denouveaux
utilisateursd'enbene ier. Lemanquede oheren e,tantauniveaudelanomen laturequ'au
niveau de la programmation, se traduit par une omplexite supplementairede l'initiation a
elogi iel.
Cedo ument presentedierentstravauxettented'uniformiserle adre detravailfutur,pour
enrayeruneeventuelle derive...
Ontrouveraal'interieur de e manueldestextese rits enpartiepardespersonnesqu'ilfaut
iter:
Jean-Fran ois Rivest Il lui revient le merite d'avoir e rit la premiere librairie etoee de
traitement d'imagesau Centreetde l'avoir diusee;
Christophe Gratin L'initiateurdes traitements morphologiquestridimensionnelspar
logi- iel. Sa librairie s'appuiesur l'interpreteur Xlisp-Stat,qui est devenu l'interpreteur de
base ;
Hugues Talbot Le on epteurdenombreusesfon tions,y ompris ellestraitantlesgraphes
;
Mike Clarkson Le premiera avoir propose etintegre les travauxdes her heurs.
Ilfautegalement remer ier les dierentes personnes quiont ontribue au developpement du
Droogen-I L'interpreteur de ommandes iii
1 Utilisation de l'interpreteur v
1.1 Lespremiers pas . . . vi
1.1.1 Debut d'unesession . . . vi
1.1.2 Quelques expli ations on ernant lelangage . . . vi
1.2 Lestypesd'objets ren ontres . . . vii
1.2.1 Les typesdedonnees . . . vii
1.2.2 Evaluationsetassignations . . . viii
1.2.3 L'orientationobjet . . . x
1.3 Operationssur desnombres . . . x
1.4 Operationssur quelquestypes dedonneesparti ulieres . . . xii
1.4.1 Cha^nesde ara teres . . . xii
1.4.2 Listes . . . xiii
1.4.3 Tableaux . . . xiv
1.5 Operationsbooleennes ettests . . . xiv
1.5.1 Operationslogiques . . . xiv
1.5.2 Tests de omparaison . . . xv
1.6 Contr^ole debou les. . . xv
1.6.1 Blo s . . . xv
1.6.2 Prisede de ision . . . xv
1.6.3 Bou les iteratives. . . xvi
1.7 Manipulationdes hierset impression. . . xvii
1.7.1 Manipulationdes hiers . . . xvii
1.7.2 Impression . . . xix
1.8 Fi hiers ript . . . xx
2 Les omposantes de Xlim3d xxi 2.1 Lesimages. . . xxi
2.1.1 La stru tured'image 2D . . . xxi
2.1.2 La stru tured'image 3D . . . xxii
2.2 Lesgraphes . . . xxiv
2.2.1 Lesgraphes entant que stru turesupplementaire . . . xxiv
2.2.2 Lesgraphes relatifsala partie3D . . . xxvii
3 Developpement de programmes xxxi
3.1 Developpement de programmes Lisp . . . xxxi
3.1.1 Ajoutd'une fon tion . . . xxxi
3.1.2 Chargement de hiers . . . xxxiv
3.1.3 Deboggage . . . xxxiv
3.2 Developpement de librairies ompilees . . . xxxvi
3.2.1 Ajoutd'une fon tion . . . xxxvi
3.2.2 Exemple: developperunefon tionquitraiteles graphes . . . xxxvii
3.2.3 Deboggage . . . xlii II Xlim3D: manuel de referen e 1 4 Les images 3 4.1 La stru tured'image . . . 3 4.2 La grilled'image . . . 4 4.3 Entree etsortie . . . 5 4.3.1 Le tured'images . . . 5 4.3.2 E ritured'images. . . 12 4.3.3 Visualisationd'images . . . 16
4.3.4 Agrandissementd'images (zoomdire t etinverse) . . . 21
4.3.5 Impression d'imagesa l'e ran . . . 23
4.4 Conversion de formatd'image . . . 23
4.5 Proprietesd'image . . . 24
4.5.1 A es aux ara teristiques desimages . . . 29
4.5.2 A es auxvaleursdes images . . . 33
4.5.3 Translation, rotationettransposition. . . 34
4.6 Operationselementaires surdes images. . . 37
4.6.1 Operationselementaires surdes ensembles . . . 37
4.6.2 Operationselementaires surdes images enniveaux de gris . . . 37
4.6.3 Seuillage. . . 39
4.6.4 Fon tions al uleesen haque pixel . . . 41
4.6.5 Operationsarithmetiques . . . 42
4.6.6 Comparaisond'images . . . 47
4.7 Manipulationdesniveaux de gris . . . 49
4.8 Gestionde lamemoire . . . 50
4.8.1 Creationetdestru tion d'images . . . 50
4.8.2 Gestiond'une fen^etre dansl'image . . . 55
4.9 Copie{ olleret masquage . . . 56
4.10 Transformations lineaires . . . 57
4.10.1 Filtrage par onvolution . . . 57
4.10.2 Filtrage parpassagedansle domainetransforme . . . 58
5 Operations morphologiques de base 65
5.1 Erosionetdilatation . . . 65
5.1.1 Erosion etdilatationave deselementsstru turantsspe iques . . . . 67
5.1.2 Erosion etdilatationdansdes dire tionsarbitraires. . . 68
5.1.3 Erosion etdilatationadaptativesdans desdire tions quel onques . . . 71
5.2 Erosionetdilatation de rang{maximum . . . 73
5.3 Erosionetdilatation ave deselements stru turantsen niveaux de gris . . . . 74
6 Pro edures elementaires 77 6.1 Ouvertureetfermeture. . . 77
6.1.1 Ouvertureetfermeture ave deselements stru turantsspe iques. . . 78
6.1.2 Ouvertureetfermeture dansdesdire tions quel onques . . . 80
6.1.3 Ouvertureetfermeture adaptativesdansdesdire tions quel onques . 83 6.2 Ouvertureetfermeturede rang{maximum . . . 85
6.3 Ouvertureetfermetureave desfon tions stru turantes . . . 86
6.4 Filtragemorphologique. . . 87
6.4.1 Toggle mapping ( ontraste) . . . 87
6.4.2 Filtres auto-median . . . 87
6.4.3 Supremumde plusieursoperateurs . . . 88
7 Composantes onnexes 91 7.1 Mesuresfondamentales . . . 91
7.2 Mesuresde frequen es . . . 92
7.2.1 Histogrammes. . . 92
7.2.2 Manipulationd'histogramme . . . 93
7.3 Mesuresstatistiquesetdistributionsaleatoires. . . 94
7.3.1 Generation de valeurs aleatoires. . . 101
7.4 Analysedeparti ules individuelles . . . 101
7.4.1 \Labelisation"de parti ules . . . 101
7.4.2 Nombre d'Euler. . . 104
7.4.3 Statistiquesd'image surdes domainesdenispardes labels . . . 105
7.5 Granulometrie . . . 109 7.6 Fon tiondistan e . . . 109 8 Gradients 113 8.1 Gradientsusuels . . . 113 8.2 Residus . . . 114 8.3 Chapeau haut-de-forme . . . 115 8.4 Gradientsde surfa e . . . 117 8.4.1 Azimuthdu gradient . . . 117 9 Squelettes 119 9.1 Squelettes binaires onstruitsa partirde marqueurs . . . 120
9.2 Centrodes. . . 120
9.3 Transformee partoutou rien . . . 121
9.5.1 Amin issement homotopique . . . 123
9.5.2 Amin issement isotrope . . . 123
9.5.3 Squelettepar e hage . . . 124
9.6 Points ritiques,etudedu voisinage . . . 124
9.6.1 Pointsde terminaison . . . 124
9.6.2 Pointsmultiples . . . 125
9.7 Ebarbulage . . . 126
10 Geodesie 127 10.1 Erosionetdilatation geodesiques . . . 127
10.2 Re onstru tions . . . 129
10.2.1 Sele tiond'objets parre onstru tion . . . 131
10.3 Residus obtenus apres re onstru tion . . . 132
10.4 Fon tions de distan egeodesique . . . 132
10.5 Zonesd'in uen egeodesique. . . 133
10.5.1 Squelettes parzones d'in uen e. . . 133
11 Ligne de partage des eaux, integrale et e hage 135 11.1 Lignede partage des eaux . . . 135
11.2 Lignede partage des eauxave marqueurs . . . 138
11.3 Integrale . . . 139
11.4 Fle hage . . . 141
12 Dete tion des extrema et dynamique 147 12.1 Dete tion d'extrema regionaux . . . 147
12.2 Dynamique . . . 151
13 Les graphes 3D 153 13.1 Graphespredenisetfon tions s'yappliquant . . . 153
13.1.1 Variables . . . 153
13.1.2 Fon tions surles graphes . . . 154
14 Codage 157 14.1 Cha^nesdeFreeman . . . 157
15 Analyse de textures et lassi ation 159 15.1 Traitement de textures . . . 159
16 Un langage pour le traitement d'images 161 16.1 Commandedu systeme d'exploitation . . . 161
17 Non- lasse 163 18 Les elementsstru turants: lasses et methodes 165 18.1 La lasseSelement . . . 165
18.1.1 Donnees . . . 165
18.2.1 Donnees . . . 165 18.2.2 Methodes . . . 166 18.3 La lasseHomoteti SE . . . 168 18.3.1 Donnees . . . 168 18.3.2 Methodes . . . 168 18.4 La lasseImageSE . . . 170 18.4.1 Donnees . . . 170 18.4.2 Methodes . . . 170
19 Les graphes: nouvelle stru ture dans XLispStat 173 19.1 Lesfon tions surles graphes. . . 174
19.1.1 Creationetdestru tion de graphes . . . 174
19.1.2 AÆ herles graphes. . . 176
19.1.3 Arithmetique surles graphes . . . 177
19.1.4 Comparaisonde deux graphes. . . 178
19.1.5 Informationsur lesgraphes . . . 178
19.1.6 Operationsmorphologiques . . . 179
19.1.7 Operationlineaires . . . 180
19.1.8 Marquaged'un nuddu graphe . . . 181
19.1.9 Graphes etarbres . . . 181
III Ra e Proje t 183 20 Fun tion des ription 185 20.1 Generalpurposeand system . . . 185
20.2 Read&writeimages . . . 185
20.3 Visualizationand general imagemanipulation . . . 186
20.4 Filters . . . 186 20.5 Re onstru tion . . . 187 20.6 Skeleton . . . 188 20.7 Labeling . . . 190 20.8 Contour . . . 192 20.9 Coding. . . 194 20.10Entropy oding . . . 196 20.11Buermanipulation . . . 198
Utilisation de l'interpreteur
Il est bien onnu que le langage Lisp est un langage d'intelligen e arti ielle. La plupart
desmanuelsquilede rivent ont e type d'appli ationsal'esprit. La pratiquereserve
epen-dant un autre usage a l'interpreteur; dans ertaines appli ations, il sert de lien ave des
librairies de langage ompile. Les raisons sont simples: on a la fa ilite d'un langage
in-terprete ave la vitesse d'un langage ompile. Cela permet des developpements rapides de
programmes puisqu'onevite la ompilation etpar e qu'il est possiblede dialoguer aisement
ave l'interpreteur, parexempleen aÆ hant desmessages.
Le programme Xlim3D est base sur le langage deni par l'interpreteur Xlisp-Stat qui
permet toute une serie d'operations omprenant notamment des manipulationsstatistiques
de donnees, des operations ve torielles, un systeme de programmation oriente objet et un
me anisme d'allo ationdynamique. Des librairiesde traitement d'image ont ensuite ete
gr-eees sur e noyau en exploitant au mieux les deux derniers atouts du langage interprete,
'est-a-direqu'unepartiedestraitements(notamment eluideselementsstru turants)sefait
dans la philosophied'une orientation objet et que l'interpreteur harge dynamiquement des
librairiessuivantles besoins. Celaeuteteimpossibleave l'interpreteurXlispsurlequeletait
onstruitXlim[3 ℄. C'est ChristopheGratin[1 ℄quia songe autiliserl'interpreteur Xlisp-Stat
pour proter du potentiel de l'orientation objet. Il faut aussi feli iter Mi hel Bilodeau qui
a opere lafusiondes logi ielsexistants pouren faire des\pa kages" que l'on peuta present
harger dynamiquement. Gr^a e a e hargement, il est possible d'inserer du ode ompile
m^eme durant l'utilisation de l'interpreteur pour ee tuer une mise au point ou eviter que
l'interpreteur ne prenne trop de memoire au hargement. Remer ions enn Jean-Fran ois
Rivest dont lesrapportsont servi de baseau present do ument.
Cettepartie dumanuelde rit l'utilisationdu langage interprete. Sansvouloiretablirune
listeexhaustivedesfon tions(voir[4 ℄pour ela),nouspresenteronsles ommandesdebasede
l'interpreteurendetaillantlesquelquesparti ularitesdulangageXlisp-Statquiledieren ient
x CHAPTER 1. UTILISATION DE L'INTERPRETEUR
1.1 Les premiers pas
1.1.1 Debut d'une session
Assurez-vousd'abordqueles exe utablesXlim3detxlispsontdenies dansvotre\PATH".
Si le logi iel est bien ongure, il suÆt de le lan er en tapant la ommande Xlim3d. Le
programme verie alors si le repertoire ourant ontient un hier init.lsp, sinon il vous
demande d'en pla er un dans le repertoire. Ce hier est important par e qu'il denit des
variablesbienutilesal'utilisationdeslibrairiesdetraitementd'image. Onpeutaussiajouter
des ommandes qui ongurent l'interpreteur d'une ertaine maniere, omme en hargeant
pardefautl'uneoul'autrelibrairie,ou en oredemanderaXlim3dde hargerimmediatement
un hier en faisant Xlim3d fi hier.lsp. L'interpreteur hargera alors init.lsp et
en-suite fi hier.lsp. Pour sortir du programme, Ctrl-C ne fon tionne pas par e que ette
ommande est reservee a l'interruption deroutinesLispmaisil fauttaper(exit).
1.1.2 Quelques expli ations on ernant le langage
Ilya deuxtypesderesultat quel'interpreteur deXlim3D est apablede fournir. Le premier
est l'evaluation d'une expression. Les quelques lignes suivantes denissent une variable et
evaluent son ontenu:
> (setf a 10)
10
> a
10
>
La variableavautbien10. La deuxieme utilite estlarealisation d'unea tion, e quien Lisp
s'exprimeparun jeude parentheses ontenant lafon tionet ses arguments. Ainsi,
> (+ 1 2)
3
>
realise l'addition de 1 et 2. En fait, Lisp utilise une notation fon tionnelle sous la forme
(fon tion argument1 argument2), evalue la quantite entre parentheses et retourne le
resultat de l'evaluation. Chaque valeurpeutalors^etre utilisee omme argument d'une autre
fon tionelle-m^emeentreparenthesesetainsidesuite. Laprioriteestdonneeauxparentheses
interieures. Lesinstru tions
> (+ (* 2 3) 4)
10
>
seront traduites respe tivement par(+ 6 4)etpuispar10.
Le langage Lisp est base sur le on ept de liste. En d'autres termes, ontrairement au
langage C, le nombre d'argumentsdes fon tions ainsique leurtype est plussouple. Le Lisp
Les ommentaires ommen ent toujours par un point virgule (;). Tout e qui suit sur
la m^eme ligne sera ignore par l'interpreteur. Notons aussi que l'interpreteur onvertit tout,
hormisles ha^nes ara teres,enmajus ules. Nous onseillonsneanmoinsd'utiliserdes
majus- ulesa ertainsmomentspouraugmenterlalisibilitedu ode,parexemplelorsdeladenition
de onstantes.
1.2 Les types d'objets ren ontres
Le Lispmanipuledesnuds,sortes d'entite debasequi ontiennentdesinformations omme
une valeur, un type, ... Une fon tion ou une image est ontenue dans un nud. Cette
stru ture fondamentale est a l'origine de l'implementation en C de l'interpreteur et quand
sontvenuesleslibrairiesde traitement d'images,ilafalluadapterlastru turedunudpour
qu'iltraite orre tement les images.
1.2.1 Les types de donnees
Xlisp-Stat gere plusieurstypes de donnees. Voi i laliste des prin ipauxtypes proposes par
l'interpreteur a laquellenous avons ajoute les typesimage et graphe:
Les entiers. Ce sont deslong omme enlangage C;
Lespoints ottants. Cesontdesdouble ommeenlangage C.Ilfauttoujoursmettre
le pointde imaldans unnombrean qu'iln'yait pasde meprise, ommedans\5.0";
Les nombres omplexes. En guise d'exemple, (setf a (sqrt -1)) ree le nombre
omplexe a;
Les tableaux,quipeuvent ontenirtousles autrestypes,eux-m^eme omprislorsqu'on
veut fairedestableaux multidimensionnels;
Les ha^nes de ara teres;
Les objets;
Les listes;
Les variables booleennes. Elles n'ont que la valeur \true" notee T ou NIL qui est
egalement lesigne d'uneliste vide;
Les pointeurs de hier(\streams");
Les imagesquipeuvent ^etre 2Dou 3D;
Les graphes.
Tester un type. Parfois, il peut^etre utilede savoir quelestletyped'unsymboleou d'un
argument de fon tion. Nous avons dressela listedes predi ats quiexaminent letype de leur
xii CHAPTER 1. UTILISATION DE L'INTERPRETEUR
(floatp a) veriesi aest unreel;
( omplex a)veriesiaest un nombre omplexe;
(numberp a)veriesiaest un nombre(entier,reelou omplexe);
(arrayp a) veriesi aest untableau;
(stringp a)veriesiaest une ha^nede ara teres;
(obje tp a)veriesiaest un objet;
(listp a) veriesiaest uneliste;
(streamp a)veriesiaest un pointeurde hiers;
(image2dp a) verie siaest uneimage2D;
(image3dp a) verie siaest uneimage3D;
(graphp a) veriesi aest ungraphe.
Ilyaunefon tionqui,bien que ene soitpasuntest proprementdit,retourneletype de
a entouteslettres: (type-of a).
1.2.2
Evaluations et assignations
On assigne unevaleur a unevariable en utilisant la fon tion setf (ousetq) ou def. Cette
derniere instru tion memorise la variable et permet surtout de trouver une tra e des
on-stantesentapantl'instru tion(variables). Onlibereunevariabledenieave (def a)par
(undef 'a)(noterlapresen ed'un\quote"dontl'utiliteestde rite i-apres). Voi iquelques
exemples:
> (setf var 5) ; On ree la variable var ontenant 5
5 ; Xlisp repond ela
> var ; On evalue var
5 ; Xlisp repond ela
> (def GRID "s") ; La onstante GRID re oit la haine "s"
GRID
> (variables) ; La fon tion qui imprime la liste des onstantes
(GRID)
> (undef 'GRID) ; On lib\`ere GRID
GRID
> (variables) ; La liste sera vide
NIL
>
On peutegalement fairedesassignations multiples:
> (setf b 4 6 d "foo")
Laderniereexpressionevaluee sera ellequisera retournee.
Uneregleimportanteaproposdesassignations: nejamaisassignerunsymboledejareserve
par le systeme { 'est la raison pour laquelle les fon tions usuelles de Xlisp-Stat se trouvent
dansl'indexdesfon tionsetdanslepaquetxlispstatdel'indexdes\pa kages". Ce inepeut
que auserdesproblemes. Frequemment,Xlisp neseplaindrapasmaise rasera tout
simple-ment la valeur pre edemment sto kee sous e nom, e qui peut avoir des eets desastreux.
En parti ulier, ne jamais assigner le symbole `T', ou `NIL'... Ce sont des erreurs qui sont
ommunement faites. Parfois, il arrive qu'on ne desire pas evaluer uneexpression. Pour e
faire,Lispmetadispositionlafon tionquote ou'poureviteruneevaluation. Ainsi,(setf
plus '(+ a 5)),equivalentea (setf plus (quote (+ a 5))),est unefon tionquidenit
l'additionde a et5. Quelqueslignes pourillustrerle omportement:
> (setf plus (quote (+ a 5))) ; Definit une fon tion "plus"
(+ A 5)
> (setf a 5)
5
> (eval plus) ; "eval" for e l'evaluation de plus (interessant pour une
10 ; fon tion) > (setf a 15) 15 > (eval plus) 20 >
Enagissant delasorte, nousavonsdeni unefon tionavant quela variable ane soitdenie
puisquel'evaluation estrepoussee jusqu'aumoment del'appel(eval plus).
La fon tion quote est ouramment utilisee pour obtenir de l'aide sur une fon tion. En
eet,(help 'fon tion)fournituneaide en ligne. Dem^eme,(apropos 'name) listetoutes
lesfon tionsdontlenom ontientla ha^nede ara teres\name". Celameriteuneillustration:
> (help 'def)
DEF [fun tion-do ℄
Syntax: (def var form)
VAR is not evaluated and must be a symbol. Assigns the value of FORM to
VAR and adds VAR to the list *VARIABLES* of def'ed variables. Returns VAR.
If VAR is already bound and the global variable *ASK-ON-REDEFINE*
is not nil then you are asked if you want to redefine the variable.
NIL > (apropos 'ero) HERO A-SERO GBIPERO VEROS VEROH A-HERO SERO
xiv CHAPTER 1. UTILISATION DE L'INTERPRETEUR
ZEROP
ERO
NIL
Enayantfait(apropos 'ero),l'interpreteuraÆ helalistedetouteslesfon tionsqui
perme-ttentde faireuneerosionmorphologique(saufzerop). L'interpreteurest apabledegerer les
informationsd'aideparlui-m^emetressimplementa partird'une ha^ne de ara teres inseree
apres la denition du prototype d'une fon tion. Cette possibilite est tellement importante
que,avantm^emeavoirexplique ommentdenirunefon tion,nousavonsjugeutiledefournir
un exemple.
> (defun aire (r)
"Cal ule l'aire d'un disque a partir de son rayon"
(* r r 3.14))
AIRE ; La fon tion aire existe desormais ainsi qu'une aide en ligne
> (help 'aire)
AIRE [fun tion-do ℄
Cal ule l'aire d'un disque a partir de son rayon
NIL
1.2.3 L'orientation objet
L'obje tif poursuivi par les on epteurs de Xlisp-Stat en introduisant des notions de
l'orientation objet est la fa ilite de mise au point de l'interfa e. Cela ne signie pas que
l'utilisationdes on epts soitlimitee alaprogrammationdel'interfa egraphique. Xlisp-Stat
fournit un type \objet" et une serie de fon tions apables de les traiter. Par ailleurs, la
partie 3D de Xlim3D utilise une hierar hie d'objet pour traiter les elements stru turants.
Idealement, lesimages devraient^etre desobjets maisonest en oreloind'unetelle situation.
Nous invitons le le teur a onsulter le do ument [4℄ pour une des ription detaillee de
l'orientationobjetdansle adrede Xlisp-Stat.
Nous allons a present de rire une serie de fon tions qui s'appliquent aux dierents. La
listen'estbien s^urpasexhaustive maiselle omporte lesinstru tions lesplusutiles.
1.3 Operations sur des nombres
Avant d'entamer une des ription des fon tions qui traitent les nombres, il faut faire une
remarque on ernantlapresentationdesresultats. Un hire3apparaissanttelquelal'e ran
peut ^etre un entier ou un reel. Sa hant que la fon tion sqrt retourne toujours un reel, on
peut omprendre e quisepasse quand on exe ute es quelqueslignes:
> (sqrt 9) ; On prend la ra ine arr\'ee de 9
3
> (integerp (sqrt 9))
NIL ; Le resultat n'est pas un entier ...
> (floatp (sqrt 9))
Conversion du type des nombres. Il est fondamental d'^etre apable de onvertir des
nombres d'un type dans un autre. Pour onvertir un reel en un entier, les operations sont
(trun ate a), quirendentieren supprimantla partiede imale, et (floor a),quitronque
toujours versle pluspetit entier. Pour onvertir un entieren reel,ilfautfaire(float a).
Operations arithmetiques. Voi i les operations importantes que l'on peut faire sur
les nombres: il y a les operations arithmetiques, qui peuvent prendre un nombre variable
d'arguments(2 au minimum):
(+ a b ) Additionde a,b, ;
(- a b ) Soustra tion de a,b, ;
(* a b ) Multipli ationde a,b, ;
(/ a b ) Divisionde aparbet . Cal ule(a=(b ));
(min a b )Minimumentrea, b, ;
(max a b )Maximumentrea, b, ;
(rem a b) Reste de ladivisiondeapar b(Exemple: (rem 3.5 1.1)fournit0.2).
Si un des arguments des operations pre edentes est reel, le resultat sera reel luiaussi. Une
remarque importante sur ladivision. Ave l'an ieninterpreteur Xlisp,si tous les arguments
de la division etaient des entiers, la division etait entiere, i.e. le resultat etait tronque a
l'entier. Ce n'estplus le as dansla version a tuelle de Xlim3d quiretourne parfois un reel
m^eme siles arguments sont entiers. Parexemple,
> (/ 5 3) ; Un division entre nombres entiers
1.66667 ; ... ne produit pas un entier
> (integerp (/ 6 3))
T ; sauf si a est un multiple de b
>
Lesoperateursarithmetiquespeuventaussis'appliqueradeslistesouaunmelangedelistes
et de nombres. On dit alors que les fon tions ont ete \ve torisees". Quelques ommandes
illustrentlari hessedu langage.
> (+ '(1 2 3) '(4 5 6)) ; On additionne deux listes de meme longueur
(5 7 9)
> (+ 5 '(1 2 5)) ; Le nombre est ajoute a ha un des elements
(6 7 10)
>
Ily aaussides operationsa uneseuleoperande:
xvi CHAPTER 1. UTILISATION DE L'INTERPRETEUR
Operations parti ulieres. Voi iquelquesoperations quipeuvent servir:
(abs a) Valeurabsoluede a;
(sin a) Sinusde a. L'angleest exprime en radians;
( os a) Cosinusdea;
(tan a) Tangentede a;
(sqrt a) Ra ine arree de a(leresultat est ne essairement un reel);
(exp a) Exponentiatione a
(leresultatest un reel);
(expt a b) ou(^ a b) produit a b
ou aetbpeuvent^etre desentiersou desreels;
(log a) Logarithme neperien;
(random a) retourneun nombre aleatoire entre0 eta-1.
1.4 Operations sur quelques types de donnees parti ulieres
1.4.1 Cha^nes de ara teres
Le Lisp ontient tout edont onabesoinpourtraiterles ha^nes. Cettese tionnementionne
que e quiestleplusfrequemment ren ontre.
Lorsqu'on veut imprimer des ha^nes de ara teres, il peut s'averer utile de rajouter les
ara teres de ontr^ole suivants, unpeu telsqu'ilssont denisdansle langage C:
retour de hariot;
retour de hariot sanssaut deligne;
ara tere detabulation.
Pour on atener des ha^nes, on peut utiliserla fon tion (str at a b ...) qui
on- atene les ha^nes a b . La fon tion (format) produit le m^eme genre de resultat mais sa
mise en uvreest pluslourde.
Il y a egalement tout un ensemble de fon tions de omparaison. Par exemple, la
fon -tion (string= a b) qui ompare deux ha^nesde ara teres. Ave ette fon tion, on peut
egalement omparerdessous- ha^nesenutilisantles les:start1 :start2 :end1 :end2qui
indiquentrespe tivement le numerodu ara tere du debutde la omparaison pourla ha^ne
1, pourla ha^ne 2,etles nsde omparaison. Voi iquelquesexemples:
(string= "J Smith" "K Smith" :start1 1 :start2 1)
; supprime les premiers ara teres, et retourne T
(string= "a" "b") ; retourne NIL
(string= "a" "a") ; retourne T
Pour ouper des mor eauxde ha^nes, il ya aussiune fon tion: (subseq string start
1.4.2 Listes
Presque par denition, Xlisp est apable de travailler sur des listes. D'abord une petite
expli ationsur equ'estuneliste. Ensuite,nousdetailleronsquelquesfon tionsdetraitement
delistes.
Unelisteestunensembledetaillevariabled'objetsquel onques omprisentreparentheses.
Onpeutegalement avoir deslistesde listes, des listesde tableaux, etainside suite. (12 15
18 22) et(12 "a" 3.14) sont toutesdeuxdes listes.
Ilyaunequantiteenorme de fon tionsquiservent agerer des listes.
Etant donne que e
sont frequemment desstru tures imbriquees, il peutetre^ assez diÆ ilede savoir a quoion a
a estant les nuan es,quifont laerte deslispiens,sont nombreuses.
Voi ilesfon tions jugees les plusutiles:
(list a b ...) ree uneliste ave les elements a b .... On peut aussi mettre
uneliste a l'interieur d'uneautre, ommedans l'exemple(list 1 2 (list 3 4))qui
retournera(1 2 (3 4));
(first a) extraitet retournelepremierelement de lalistea;
se ond, third, fourth retournent respe tivement le se ond, le troisieme et le
qua-triemeelement de laliste;
(nth n liste) retournelen-emeelement de laliste;
(rest liste)retournela listemoins lepremierelement;
(last liste) retourne une liste omposee du dernier element de la liste. (append
liste1 liste 2)ajoutelaliste2auboutdelaliste1pourneformerqu'uneliste. Par
exemple: (append '(1 2 3) '(4))retourne (1 2 3 4).
Quelqueslignes pourillustrerl'usagedes fon tions:
> (setf a (list 1 2 3 4))
(1 2 3 4) ; Voi i e que Xlim3d retourne
> (setf b (list "Hello" "world"))
("Hello" "world")
> (setf '(1 2)) ; Remarquer la presen e du quote qui evite l'evaluation
(1 2)
> (list a b )
((1 2 3 4) ("Hello" "world") (1 2)) ; Listes imbriquees
> (append a b ) (1 2 3 4 "Hello" "world" 1 2) > (rest a) (2 3 4) > (last a) (4) > (se ond b)
xviii CHAPTER 1. UTILISATION DE L'INTERPRETEUR
1.4.3 Tableaux
Les tableaux sont des stru tures qui ressemblent beau oup a elles ren ontrees dans des
langagesdeprogrammationplustraditionnels ommeleFortran. Ona edeaunelementd'un
tableauenspe iant sonnumero. L'indi edupremierelementestzero. Lestableaux, omme
en Fortran,ne peuventpas^etre rallongesaisement. Sionne onna^tpaslatailleinitialed'un
tableauetquelalongueurestsus eptiblede hanger onstamment,ilestpreferabled'utiliser
deslistes.
La dieren e notable des tableaux ave les autres langages, 'est qu'il est possible de
sto ker des donnees de type dierents dans un m^eme tableau. Par exemple, l'element 0
peut sto ker un entier, l'element 1 une liste, et . Commetoujours, pour fairedes tableaux
multidimensionnels,ilfautsto ker destableaux dansles tableaux.
Voi iquelquesfon tions pourgerer des tableaux:
(make-array taille) ree untableau dela tailletaille;
(ve tor e1 e2 e3 ...) ree un tableau et l'initialise ave les expressions e1 e2 e3
... La tailledu tableausera ajustee pour ontenir toutesles expressions;
(aref tableau no)a ede al'element no dutableautableau.
Voi iun exemple:
> (setf tableau (make-array 2)) ; Creation d'un tableau
#(NIL NIL)
> (setf (aref tableau 0) 0) ; Assignation: tableau[0℄<=0
0
> (setf (aref tableau 1) '("a" 1)) ; Assignation: tableau[1℄<=(list "a" 1)
("a" 1)
> tableau ; Imprime le ontenu du tableau
#(0 ("a" 1))
1.5 Operations booleennes et tests
Ces operationssont destests an de manipuler etde generer les variablesbooleennes vraies
T etfaussesNIL.
1.5.1 Operations logiques
On peutfairedes operationslogiquesave les variablesbooleennes:
(and a b) et logiqueentre aetb;
(or a b) oulogiqueentre aetb;
1.5.2 Tests de omparaison
Ily aun grandnombred'operateurs de omparaison. Voi i euxqui sont utiles:
(= a b) verie si aet b sont numeriquement egaux. Les arguments peuvent ^etre des
entiers ou desreels;
(/= a b)veriesiaetbnesontpasegaux. Attention,(n=ab)estinterprete omme(=ab)etnonpas omme(==ab);(< a b)verifiesiaestpluspetitqueb;
(> a b) veriesiaest plusgrand queb;
(<= a b) veriesi aestpluspetitou egal ab;
(>= a b) veriesi aestplusgrandou egal ab;
(null a) veriesi laliste aestvide.
1.6 Contr^ole de bou les
Les lispiens ont tendan e a ne pas utiliser les stru tures de ontr^ole des programmes de la
m^emefa on quelerestedumonde. Dans ette se tion,nousmontrerons omment utiliserles
stru tures de ontr^olede Lispave unfort a ent langage C.
1.6.1 Blo s
Il y a quelques fon tions pour onstruire des blo s en Lisp. Les lispiens font generalement
la grima e et preferent utiliser d'autres onstru tions mais, omme il n'est pas question
d'esthetique i i,elles valent lapeined'^etre presentees.
(prog1 (fa a) (fb a) (f a) ...)exe utelasequen edefon tions(fa a) (fb a)
(f a) ... La valeurretournee est elle de lapremiereexpressiona^etreevaluee;
(progn (fa a) (fb a) (f a) ...) m^eme hose que (prog1 ...), sauf que 'est
maintenant leresultat de laderniereexpressiona^etre evaluee qui sera retournee.
Pourretournerunevaleurd'unblo d'instru tions,oud'unebou le,toutenl'interrompant,
utiliserlafon tion (return a). Cette fon tion retourne du blo en question lavaleur de a.
Cesfon tionssontexa tement ommedes onstru tionsdetype\begin{end"quel'onretrouve
enPas al.
1.6.2 Prise de de ision
Voi iles fon tions pourprendre desde isions.
(when test (fa a) (fb a) (f a) ... )quand testestegal a T, exe ute lasuite
d'instru tions(fa a) (fb a) (f a)... C'est ommeun\if"enlangageC,saufqu'il
n'y a pasde lause\else";
xx CHAPTER 1. UTILISATION DE L'INTERPRETEUR
(if test (then) (else optionnel)) si l'expression test est vraie, exe ute
l'expression then. Sinon, et s'il y a un else, exe ute elui- i. La valeur retournee est
ellede thenquandtestestvrai,sinonelse. S'iln'yapasdeelse,etquethenn'est
pas evaluee, 'est NIL qui est retourne. Il faut noter que si l'on desire faire plusieurs
operations dansunif, ilfaututiliserdesblo save prog1ou progn.
Quelquesexemples:
(when (= a b)
(print "a et b egaux")
(print (* a b)))
(if (/= a b)
(progn
(print "a et b differents")
(print (+ a b))
)
(progn
(print " e i est la lause else")
(print (- a b))
)
)
1.6.3 Bou les iteratives
Voi imaintenant les manieres de fairedes bou les:
(loop (fa a) (fb a) (f a) ...)Cettefon tionestunebou leinnie. Elleexe ute
lasequen e (fa a) (fb a) (f a) ... jusqu'a equ'ilyaitinterruptiond'unefa on
ou d'uneautre. Generalement, on interrompt e type debou le enutilisantlafon tion
(return). Parexemple:
> (setf a 0)
0
> (loop
(print "Hello")
(setf a (1+ a))
(if (= a 3) (return "fin de bou le."))
(print "non, on ontinue!")
)
"Hello"
"non, on ontinue!"
"Hello"
"non, on ontinue!"
(dotimes (a stop ret) (fa a) (fb a) (f a)...) Cette fon tion est une bou le
iterative. a part a zero et ontinue jusqu'a tempsqu'elle atteigne stopex lusivement.
La variable aest unevariable lo ale, e quisigniequ'elle n'est onnue qu'al'interieur
de la bou le. S'il y a un autre symbole a a l'exterieur de la bou le, sa valeur sera
onservee. A la n de la bou le, l'expression optionnelle ret est retournee. S'il n'y a
pas deret lavaleurretournee est NIL. Parexemple:
(dotimes (a 10 " 'est fini!")
(print a))
Cet exemple imprimerade0 a 9etretournera ommevaleurnale" 'est fini!".
(dolist (sym liste ret) (fa a) (fb a) (f a) ...)
C'est unebou leiterative. Ellede omposelaliste\liste"elementparelement,qu'elle
assigne a sym. La variable liste est unevariable lo ale. Sa valeur n'est onnue qu'a
l'interieurdelabou le. Elleexe utele orpsdelabou leave sym ommevaleurjusqu'a
tempsquelaliste listesoitvide. Lavaleuroptionnelleretestretournee alan. Par
exemple:
> (setf liste (list "un" "deux" "trois"))
("un" "deux" "trois")
> (dolist ( haine liste)
(print haine))
"un"
"deux"
"trois" NIL
>
1.7 Manipulation des hiers et impression
1.7.1 Manipulation des hiers
L'entree de parametres ou la sauvegarde des resultats requiert la manipulation de hiers
qu'ilfaut pouvoir lire ou e rire, e quidans la plupartdes langages n'estguere aise.
Xlisp-Stat n'e happe pas a la regle. Quelques fon tions elementaires et puissantes sont de rites
i-dessous. Commeenlangage C, onmanipuledespointeursde hiersquisont passesd'une
fon tionauneautre. Cespointeurssont appeles\streams".
(open "file.txt")ouvrele hierdont lenomest \le.txt". La fon tionretourneun
pointeursur e hierquipeut^etre ouverten le ture ouen e riture.
Parexemple:
(setf pointeur (open "file.txt" :dire tion :input)
ouvrele hier\le.txt"en le ture et
xxii CHAPTER 1. UTILISATION DE L'INTERPRETEUR
(read pointeur)retourne un objetlu dans le hier pointe quelle que soitsa nature
(entier, reel, ha^ne de ara teres, ...) et passe au suivant. Cette fon tion dete te le
type de l'objetluen utilisantlam^eme syntaxe quelafon tion(prin )( f. pagexix).
Ainsi, pourune ha^ne de ara teres, il faut qu'elle soit entre des guillemets (quotes).
C'est laprin ipalefon tion de le ture disponible. Contrairement a l'usage dans Xlisp,
la fon tionne renvoie pasNIL en asde n de hier maisun message d'erreur. Pour
obtenir NIL quandon arriveala ndu hier,ilfautdonner undeuxieme argument a
la fon tion,a savoir NIL. Lasyntaxe exa te estalors(read pointeur nil);
(read-line pointeur)lituneligneentieredu hierpointeparpointeuretretourne
la ha^ne de ara teres orrespondant a ette ligne. L'interpretation de la ligne est a
harge de l'utilisateurave les fon tionsde manipulationde ha^nesde ara teres;
( lose pointeur) ferme le hierpointe parpointeur. Il est onseille de fermer un
hierapresusage.
L'exemplesuivant onstruituneliste ave tout e que ontient un repertoire:
; Cree un fi hier ontenant le resultat de ls
(system "ls > tmp_ls")
(setf file (open "tmp_ls" :dire tion :input))
; Initialisation d'une liste
(setf liste (list ))
; Bou le jusqu'a la fin du fi hier
(loop
(if (setf el (read-line file))
(setf liste (append liste (list el)))
(return)
)
(print liste)
)
Voi iun exemplequiouvreun hierettransfereson ontenu multipliepar2 dansunautre:
; Ouverture d'un fi hier en le ture et d'un autre en e riture
(setf input (open "input-file.txt" :dire tion :input))
(setf output (open "output-file.txt" :dire tion :output))
(loop
(if (setf number (read input nil))
(print (* number 2) output)
(return)
)
)
; Fermeture des fi hiers
1.7.2 Impression
Dans tous les langages, imprimerles resultats n'est pasune min eaaire. Xlisp ne fait pas
ex eptionalaregle. Cettese tionmontre ommentonpeutsedebrouillerpouravoirquelque
hose rapidement etsimplement.
Les fon tions de type PRINT
Cesfon tions impriment lesresultatssurle terminalou dansun hier.
(print a out)imprimed'abordunretour hariotsuividelavaleurde a(Xlispfaisait
l'inverse). L'argument outest optionnel: 'est le pointeura un hier. S'il estabsent,
lafon tionimprimesurleterminal. Elleretournetoujourslavaleurdea. Parexemple:
(print "hello") imprimera la ha^ne de ara teres sur le terminal. A noter que les
ha^nesde ara teres sont entoureesde guillemets;
(prin a out) imprimela valeur de a sans un retour de hariot. out est optionnel:
'est le pointeur a un hier. En son absen e, la fon tion imprime sur le terminal.
prin retournelavaleurde a. Parexemple: (prin "hello")imprimerala ha^ne de
ara teres surle terminal. La ha^ne ne serapas entouree de quotes;
(prin1 a out)faitlam^eme hoseque(prin ),saufqueles ha^nesde ara teressont
entourees de quotes;
(terpri destination)imprimeunretourde hariotsurladestination,quiest
option-nelle. S'ilellen'estpas spe iee, 'estsur leterminal.
Lafon tion format
L'usagede ettefon tionestassez omplexe. Elleestegalement trespuissanteetpolyvalente:
on peutaussibien imprimersurun terminal quedans un hier, eton peutegalement reer
une ha^ne de ara teres a l'aide de ette fon tion.
Voi isa syntaxe:
(format destination formattage expr1 expr2 ... )
ou
destinationestsoitunpointeuraun hier,soitTsionveutimprimersurleterminal,
soitNIL si onveut reer une ha^nede ara teres;
formattage estune ha^ne de ara teres spe iant le format;
expr1 expr2 ... sont lesexpressions aimprimer.
Les dire tivesde formattage importantessont:
A! : imprime la valeur de l'expression. Si 'est une ha^ne de ara teres, elle est
xxiv CHAPTER 1. UTILISATION DE L'INTERPRETEUR
! imprimeuntilde;
! seulalan d'uneligne, 'estun ara tere de ontinuation.
Unexempletypiquede e quenousavonsafaire entraitement d'images: sauvegarderdes
images (dans l'exemplesesontdes nombres)dansdes hiers numerotes de 0a 5.
(dotimes (i 6)
(setf out-name (format NIL "image~a.txt" i)) ; Cree le nom du fi hier
(setf out (open out-name :dire tion :output)) ; Ouvre le fi hier
(print i out) ; Imprime un nombre dans le fi hier (ou une autre a tion)
( lose out)
)
1.8 Fi hier s ript
Il peut ^etre interessant de onserver l'historique de toutes les instru tions Lisp que l'on a
entrees au lavier. Il existe dans Xlisp la fon tion dribble quipermet de denirun hier
dans lequelseront enregistrees toutes les ommandes; e type de hiers'appelle un hier
\s ript".
Xlim3D ontient en pluslafon tiongetpidquiretourne lenumero dupro essusXlisp en
ours. Ce i permet de reer fa ilement des noms de hiers uniquespourles hiers s ript.
Il suÆt d'in lure dans le hier \init.lsp" la ommande suivante: (dribble (format nil
"s ript~a.lsp" (getpid))),utileseulementsil'ondesire onserverunetra edetoutesles
Les omposantes de Xlim3d
Pour desraisons historiques,le logi iel Xlim3Dresulte de lafusion de deux logi ielsXlimet
Xl3d, le premier etant reserve a la manipulation d'images bidimensionnelles ontrairement
au se ond. La prin ipale onsequen e de ette fusion est la oexisten e de deux stru tures
d'images. Lemanueldereferen eindiquea haquefoissilesargumentssontdesimages2Dou
3Dentre parentheses a ^ote du mot Des ription. L'importantefon tionquifait lepassage
entre les imagesest ImCopy.
Dans etteversiondeXlim3d,ons'est ontente defaire ommuniquerlesdeuxlogi iels
en-treeuxpourqu'ilspuissente hangerdesdonnees, 'est-a-dire desimages. Laprogrammation
en Lisp apporte un peu plusde souplesse au systeme. Ainsi, la fon tion (imxv imin)
per-metdevisualiserlesdeuxtypesd'images(voir le hier\Fondamental.lsp"). Onremarquera
egalement que, puisque Xl3d etait en mesure de traiter des images 2D, un bon nombre de
fon tionsa tuelles sont redondantes. Pour ouronnerle tout, deuxstru tures independantes
de graphe sont apparues dans le logi iel: l'une est adaptee aux grands graphes (elle tiree
de Xlim), l'autre est preferable pour des petits graphes (Xl3d). Bien qu'il soit preferable
d'unierletype, en'estpastropg^enant par eque esdeuxgraphesdesserventdesobje tifs
dierents.
Les se tions suivantes de rivent les omposantes de Xlim3d. C'est un texte base sur les
rapportsdeC.Gratin,legerementadaptealanouvelleversiondulogi iel. Lapartie onsa ree
auxgraphesest lefruitdutravail de H.Talbot.
2.1 Les images
2.1.1 La stru ture d'image 2D
Lespixelsd'uneimage2Dsontdenissurunnombrexedebitsquidependde l'installation
(generalement 16bits). Ilyaussimoyende travaillerave desimagesdereelsmaisseulement
pourquelques fon tions( omme fft).
Un exemple de session ave des images 2D.
> (setf in (imread "images/ am.ras")) ; Lit une image d'entree
> (setf out (timmallo in)) ; Cree une image de sortie de meme taille
#<Foo: #f1608>
> (ero4 in out 2) ; Erosion en 4- onnexite de taille 2
#<Foo: #f1608>
> (imxv out) ; Visualisation
WRITE-RASTER: Writing raster image tmp28960.1: [256℄[256℄...
>
Si ette derniere instru tionn'estpasdisponible,il fautlan er
> (raster-write out "tmp_xlim.ras")
> (system "xv tmp_xlim.ras &")
2.1.2 La stru ture d'image 3D
La stru ture d'image 3D est elle quiest generee par une fon tion du pa kage 3D (ImGet,
ImGet2D ou ImGetSame). Ces images peuvent ^etre bi ou tridimensionnelles. Les images
bidimensionnellesne sont pas ompatibles ave e quia ete appele \stru ture d'image 2D",
par e qu'i i il y a ne essairement un bord. Les seules fon tions qui peuvent travailler ave
lesdeux typesd'image ( 'est-a-dire les stru tures d'image 2Det3D)sont lesinstru tions de
opie(ImCopy etImIsCopy).
Uneimage2Ddupa kage 3Dest deniedansleplan XZ(attention, 'estbienXZ etnon
XY), tandis que le premier plan d'une image 3D est XY. Cette implementation permet de
traiter laparite desimages 2D (tramehexagonale) et desimages 3D(trame ubique a fa es
entrees)ave lam^emestru tured'image. Que esoitleplanXZouXYn'apasd'importan e
qu'aumomentdelireuneimage. Signalonsqueleformat\visilog"admetdesimagestant2D
que 3D. Ainsinouspouvonsfaire
> (setf im2d (ImGet2D 256 256))
> (ImReadVisilog im2d filename)
etaussi
> (setf im3d (ImGet 256 256 10))
> (ImReadVisilog im3d filename)
Pour utiliserle format\raster",quiluinelitque desimages 2D,il faudrafaire
> (setf im2d (ImGet2D 256 256))
> (ImReadRaster im2d filename)
Mais les autres fon tions de le ture (ImReadAnyBitMap, ImReadText, ImReadAs ii)
n'a eptent quedesimages 3D.Dansun bitmap orrespondantauneimage3D,les premiers
pixels orrespondent au premier plan XY, tandis qu'une image 2D est vue omme un plan
XZ. Pour rendre les images 2D ompatibles ave les instru tions de le ture des images 3D,
> (setf im2d (ImGet2D 256 256))
> (ImSwapYZ im2d)
> (ImReadAnyBitMap im2d filename 256 256 20 0 0 0 0 256 256 1)
> (ImSwapYZ im2d)
Pour simplier l'usage, nous avons deni les fon tions ImReadAnyBitMap2D et
ImReadAs i2Ddontl'usage est:
> (setf im2d (ImGet2D 256 256))
> (ImReadAnyBitMap2D im2d filename 256 256 0 0 0 256 256)
> (ImReadAs ii2D im2d "im.as ")
Dans haque image estdenie unefen^etre a tive: 'est lapartie de lafen^etre sur laquelle
s'ee tue ee tivement le traitement. Elleest donnee par les oordonnees du premier point
de lafen^etre etparsestailles dansles troisdimensions.
Les images sont odees sur 8 bitsnon signes, 16 bitsnon signes ou 32 bitssignes. Mais
la plupart des fon tions sont e rites pour des images 8 bits. Il n'estdon pasassure qu'une
fon tion donnee soit appli able a une image 16 ou 32 bits. Un message d'erreur, sous la
forme Bad image type, appara^tra a haque fois que le type de l'image n'est pas supporte
par l'algorithme. Il n'existe pas a proprement parler d'images binaires. Une image binaire
sera simplementvue ommeuneimage8bitsdont lespixelsont desvaleurs nulles(i.e. pixel
eteint) ou nonnulles(i.e. pixelallume).
Certaines onventionsontete adoptees pourlesfon tions de traitement d'images,
notam-ment:
toutes les fon tions de traitement d'images ont un nom qui ommen e par Im {nous
onseillons neanmoins d'utiliser une nomen lature ou il n'y aurait plus que I pour
indiquer qu'ils'agit d'une fon tions'appliquant auneimage;
nous n'avons pas sur harge les operateurs existant ( omme par exemple add), e qui
aurait pu^etre unesolution;
lesnombres orrespondantadesvaleursdepixelspasses ommeparametresouretournes
omme resultat sont toujours donnes sous forme de reels, m^eme s'ils s'appliquent a
des images entieres (parexemple retourneun nombrereel, etdans(ImSetConstant a
value)value doit^etre un reel).
Un exemple de session ave des images 3D.
> (setf n1 (ImGet2D 256 256)) ; Creation d'une image sour e
Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄
> (setf n2 (ImGetSame n1)) ; Creation d'une autre image
Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄
> (ImReadRaster n1 "images/ am.ras") ; Initialisation de l'image
Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄
> (ImIsCopy n1 n2) ; Copie
Image (256,1,256), unsigned har, a tive window [(0,0,0),(256,1,256)℄
> (Imxv n2) ; Affi hage
2.2 Les graphes
2.2.1 Les graphes en tant que stru ture supplementaire
Dans ettese tion,nouspresentons equ'ilestne essairedesavoirpourpouvoirmanipulerles
graphesdenisau niveau du ompilateurC an de omprendreleurutilisationetde pouvoir
developperdesfon tionspersonnelles. Pourunemeilleure omprehensionde equivasuivre,
ilpeut^etrebon de sereporteraux travauxde L.Vin ent [5, 6℄.
Introdu tionsurlesgraphes morphologiques. Pargraphemorphologique,nous
enten-dons unestru turereliant dessommets (\verti es"), qui orrespondent a despoints, pardes
ar^etes (\edges"), dont les sommetsou les ar^etes peuvent^etre values.
5
12
13
9
6
7
1
7
Figure 2.1: Exemplede graphe planaireauxsommetsetar^etes values.
La stru ture que nous allons de rire permet d'avoir des graphes planaires (dont au une
desar^etes ne se roisent) ou non, des graphes orientes ou non (A est relie a B mais Bn'est
pas relie a A), onnexes ou non, mais d'une maniere generale, les graphes que nous allons
onsidererseront planaires,nonorienteset onnexes. Vin ents'etaitlui-m^emelimiteaux as
desgraphesauxar^etesnonvaluees. Lamajoritedesoperationsquenous omptonsfairesubir
aux graphesne hangent pasleur stru ture de onnexite, mais seulement les valuations des
ar^etes etdes sommets. Les graphes morphologiques sont simplement onsideres omme des
imagesaniveauxdegrisauxproprietesde onnexitevariablesselonlelieu. Commel'amontre
Vin ent,les operations morphologiquessur les images sont egalement valables laplupart du
tempssur les graphes(erosion, dilatation,lignede partage deseaux,...). Lesimages ne sont
engeneral quedesgraphes auxproprietesde onnexitetres regulieres).
La stru turede grapheimplementee est lasuivante:
typedef stru t hgraph {
int id; /* graph kind */
VERTEX *verti es; /* array of verti es */
VALUE *values; /* valuation of the verti es */
int nb_edges; /* total number of non-oriented edges */
int *neighs; /* array of ba k-relation to verti es */
VALUE *edval; /* valuation of the edges */
} HGRAPH;
Voila omment ette stru turesede ompose:
id estun entierquide rit a queltypede graphe on aaaire:
{ IDGR DELAUNAY (1) : triangulation deDelaunay;
{ IDGR GABRIEL (2): graphede Gabriel;
{ IDGR RNG (2) : graphe de voisinagerelatif.
D'autresidenti ationsdegraphe sontbiens^urpossibles: arbresde re ouvrement
min-imal,parexemple;
field est une petite stru ture qui de rit les dimensionsd'une fen^etre ne essaire pour
ontenir legraphe;
order estjuste lenombrede sommetsdu graphe;
verti esestunsimpletableaudesommets. Lastru turedesommet ontientlaposition
de haque sommet dans la fen^etre, et un index dans neighs[℄ sur le premier de ses
voisins;
valuesestunsimpletableaudem^emetaillequeverti es,et ontientlavaleur(niveau
de gris) de e sommet;
nb edges est le nombre d'ar^etes du graphe (asymptotiquement 6 fois le nombre de
sommet dans le as de graphes (triangulation de Delaunay) rees a partir d'images
mosaque);
neighs est un tableau d'assez grande taille. Il ontient des index de sommets dans
verti es, et permet de onna^tre les relations entre tous les sommets. Comme il est
de rit plushaut, haque stru ture de sommet ontient un indi e dans e tableau, qui
orrespond au premier de ses voisins. Les voisins suivant du sommet onsidere sont
ranges dans l'ordre roissant dans e tableau. Pour onna^tre l'ensemble des voisins
d'un sommet, il suÆt de regarder dans nb edges a partir de l'indexdans la stru ture
sommet du sommet en ours, jusqu'a l'index de dans la stru ture sommet du sommet
suivant. Lesindexren ontressont euxdesvoisinsdusommeten oursdansverti es.
La gure 2.2permetde mieux omprendre ette organisation;
edval est un tableau de m^eme taille que neighs, et ontient les valuations des ar^etes
du graphe.
S1
S2
S3
S4
S5
S6
S7
S1 S2 S3 S4 S5 S6 S7
S1 S3 S5 S5 S4 S7 S6 S6
Sommets :
Pointeurs de sommets :
1. Elle estrelativement souple: ellepermetde sto ker aussibien les graphesorientes que
non, lesgraphes planairesou non,et ;
2. Elleest relativement simpled'a es: les voisinsd'unsommet s'obtiennent fa ilement;
3. Par ontre, elleestgourmandeenpla esurtoutdansle asdegraphesnonorientes,aux
ar^etes non values. Chaque ar^ete est immuablement notee deux fois: une fois omme
lienentre A etB,uneautrefois omme lienentre B et A;
4. De plus, ellen'estpas tres souplelorsqu'il s'agit d'ajouter ou d'enleverune ar^ete a un
graphe. De maniere interne, on aura inter^et a revenir a une stru ture basee sur des
listes ha^nees lorsqu'onvoudra traiter e genre deproblemes.
2.2.2 Les graphes relatifs a la partie 3D
Quand ondesireparlerde onnexite,ondenitungraphe: unreseau d'ar sreliantlespoints
de l'image entre eux. En reseau hexagonal, on pourra par exemple relier un point aux six
points les plus pro hes. En reseau arre, on le reliera tant^ot aux 4 points les plus pro hes
(4- onnexite),tant^otaux8pointslespluspro hes(8- onnexite). Ungrapheestdeniparune
liste(l'objetlispien)deve teurs, 'est-a-direunelistedetripletsdevaleursreellesrepresentant
les oordonnees relatives(x,y,z) despointsreliesparun ar au point onsidere.
Une\parite" a ete introduitesur les plans(sur les lignes en 2D) de sorte que l'on puisse
travaillerenreseau ubiqueafa e entree(hexagonalen2D).Cettepariteappara^tauniveau
de ladenitiondu graphepuisqu'alorsles oordonnees relativesparrapportau point entral
peuvent^etre non entieres.
Exemple:
(def hexagonal6Gr '((-0.5 0.0 -1.0) (0.5 0.0 -1.0) (-1.0 0.0 0.0) (1.0 0.0
0.0) (-0.5 0.0 1.0) (0.5 0.0 1.0)))
Ce idenitlessixvoisinsd'unpointenreseauhexagonal. Attention: remarquezque,puisqu'il
s'agit d'un graphe s'appliquant a une image 2D, la deuxieme oordonnee est toujours nulle
(et non paslatroisieme).
Un ertain nombre de graphes standard ont et e rees dans le hier \Graphs.lsp":
square4Gr (deni dans le plan XZ), square4XYGr (deni dans le plan XY), square8Gr
(denidansle planXZ),square8XYGr(denidansleplan XY),hexagonal6Gr, ubi 6Gr,
ubi 26Gr, f 12Gr. Cesvariables pourront^etre utilisees omme parametres d'un ertain
nombrede fon tions Lisp( omme ImMinima, ImFillHoles, ImWatershed...).
ATTENTION:les ve teurs denissant ungraphe NE DOIVENT PAS posseder de
o-ordonnee stri tement superieure a 1 en valeurabsolue. La raison en est que les
algo-rithmes ne font au un test de presen e des points dans l'image. Pourquoi 1 ? Car
toutes les images possedent un bord supplementaire de 1 pixel (qui n'appara^t qu'au
niveau de la programmation en C). Si les oordonnees depassent 1 vous devrez alors
travailler sur une sous-image de vos images en utilisant les fon tions ImSetWindow et
2.3 Noyaux de points
On utilisera aussi dans les fon tions de Xlim3D une stru ture appelee noyau (Kernel) qui
est en fait identique a la stru turegraphe { 'est uneliste de ve teurs{ mais dont ler^ole est
dierent. Ondenira un noyau K par exemplepourdeterminer la moyenne, lamediane, ou
bien en orelapluspetitedesvaleursd'uneimagesurK. A ladieren edu graphe,lenoyau
pourra ontenirleve teur nul.
Exemple:
(def hexagonK '((-0.5 0.0 -1.0) (0.5 0.0 -1.0) (-1.0 0.0 0.0) (0.0 0.0 0.0)
(1.0 0.0 0.0) (-0.5 0.0 1.0) (0.5 0.0 1.0)))
Un ertainnombredenoyauxstandardontete reesdansle hier\Kernels.lsp":diamondK
(deni dansleplan XZ), diamondXYK(deni dans leplanXY), squareK(denidans leplan
XZ),squareXYK(denidansleplanXY),hexagonK, o taedronK, ubeK, ubo taedronK.
Cesvariablespourront^etreutilisees ommeparametresd'un ertainnombredefon tionsLisp
( omme ImMean, ImInfKernel, ImConvolve...).
Commedansle asdes graphes,si les oordonnees depassent 1,vous devreztravaillersur
unesousimagedevosimages enutilisantlesfon tionsImSetWindowetImSetGlobalWindow.
La gestion des bords risqueen ore de ne pas ^etre assuree onvenablement. Pruden e don ,
unefois en ore.
2.4 Les elements stru turants
Leselementsstru turantssontimplantessouslaformed'objets. Ilspeuvent^etredeplusieurs
formes:
1. de ompose omme sommed'elementsstru turantselementaires, 'est-a-dire d'elements
stru turantsdenis surun voisinage de taille1. Un telelement stru turant B (appele
\Steiner") s'e rit: B =B 1 B 2 :::B n
2. homothetique d'un element stru turant onvexe elementaire. C'est un as parti ulier
du aspre edent:
B n
=BB:::B
3. quel onque,deni sous laformed'uneimage.
Cesdistin tionssont d'originete hnique: onn'utilisepaslem^eme algorithmeselonqu'un
element stru turant peut^etre de ompose ou pas,pourdesquestions de vitessede al ul.
Ilexiste4 lassesd'elements stru turants:
La lassedebaseestla lasseSElement. L'implantationdel'elementstru turantn'est
pas onnue. Elle sert simplement de lasse-mere aux lasses qui vont suivre. Elle ne
possedeni hamp dedonneesnimethode;
De omposedSE, sous- lasse de la lasse SElement, est la lasse des element
Homoteti SE,sous- lassedeDe omposedSE, orrespondauxelementsstru turantsdu
as 2. Un element stru turant est alors deni par la donnee d'un noyau de points
(Kernel) etd'une taille;
EnnImageSE,sous- lassedeSElement,estune lassed'elementsstru turantsapriori
quel onques. Ilssont denisparuneimage.
Un ertain nombre d'instan es de la lasse Homoteti SE ont ete reees ( hier
\SE-lements.lsp"). Elles orrespondent aux boules de base asso iees aux dierents graphes:
diamondSE(denidansleplanXZ),diamondXYSE(denidansleplanXY), squareSE(deni
dansle plan XZ), squareXYSE (deni dans le plan XY), hexagonSE, o taedronSE, ubeSE,
ubo taedronSE. Cesinstan es ont ete initialiseesave unetailleegale a 1. Cette taille
Developpement de programmes
Ledeveloppementdenouvellesfon tionspeuts'ee tuersoitauniveaude l'interpreteur,soit
auniveaudu langage ompilesuivantletype defon tionsa realiser. Resteasavoir omment
debogger un programme ou ajouter une fon tion a une librairie. Nous allons de rire des
solutionspour e typede problemespourles deux niveaux.
3.1 Developpement de programmes Lisp
3.1.1 Ajout d'une fon tion
Pourqu'ellesoitutilisableauniveau Lisp,unefon tiondoit^etre denieen suivantun
proto-typeparti ulier:
(defun nom (arguments) "Aide en ligne" ( orps de la fon tion))
Passons enrevueles dierentes omposantes du prototype:
nom. Le nom de la fon tion s'e rit en un mot. Il peut ^etre quel onque mais il est
onseille de \ alquer"la nomen lature existante. Nousmettons aussien garde les
pro-grammeurs quiredenissent des fon tions existantes; e n'est pas unebonne fa on de
faire. Pouravoirunelistedesfon tionsfournies, onsultezl'indexdesfon tions alan
de e do ument;
arguments. Ladenitiondesargumentsestassez omplexe arilyamoyendedenir
des arguments optionnels et variables (&optional, &rest), ainsi que d'introduire des
les(&key) dansladenitionou en orede limiterledomaine devalidite d'unevariable
par &aux. Avant de passer a l'examen de l'usage de es mots, il onvient de pre iser
le domaine d'existen e d'une variable. Les arguments qui ne sont pre edes d'au un
mot- lef sont opiesdans esvariables(muettes)au momentd'entrer dansla fon tion.
Les arguments de lares dans le prototype seront lo aux a la fon tion. Si on utilise
des arguments quine sont pas de lares dans la fon tion, ils seront onsideres omme
globaux. Exemple:
> (setf x 10) ; La variable x est mise a 10
xxxvi CHAPTER 3. DEVELOPPEMENT DE PROGRAMMES
F ; (et y a 4)
> (f x) ; On tente de modifier x
5
> x ; La valeur de x n'a pas hange
10
Par ontre, le r^ole de (setf y 4) est moins lair. Comme telle l'instru tion va
af-fe ter lavaleurd'unevariable quiauraitexiste pre edemment. Poureviter et eet de
debordement,ilfaututiliserlemot&auxdansladenitiondelafon tion. Voi iquelques
lignes d'illustration:
> (setf y 10)
10
> (defun f (x &aux y) (setf y 4) (setf x 5)) ; Noter la presen e
F ; de &aux
> (f 5)
5
> y
10 ; La variable globale y n'est plus modifiee
>
On pla e generalement &aux a la n des arguments. Signalons une erreur frequente:
&auxlimitel'existen ed'unevariablealafon tionmaisneliberepasun blo dedonnee
qui luiest atta he. Ainsi, si y etait une image, le nud y serait libere a la n mais
pas la zone de memoire ontenant les pixels. Pour remedier a ela, il faudra liberer
expli itementlazonedememoiredesimages (parexempleave imfree)avantde sortir
de lafon tions sinonon serarapidementa ours de memoire.
Le mot &rest prend tous les arguments restants. Voi i un exemple d'utilisation qui
denituneaddition ave unnombrequel onque d'arguments:
> (defun add (x &rest y) ; y est une liste ave tous les arguments
(loop
(if (null y) (return))
(setf x (+ x (first y)))
(setf y (rest y))
) x ) ADD > (add 4) 4 > (add 4 5 68) 77 >
de l'argument qui lui est atta he. Cet argument vaut NIL par defaut. Si on veut
modier ette valeur pardefaut, on pla e l'argument ave la valeurentre parentheses.
L'implementation de la fon tion fa torielle sous forme re ursive illustre le
fon tion-nement:
> (defun fa toriel (n &optional imp) ; imp dit s'il faut affi her
(if imp (format T "n = ~a\n" n)) ; les resultats intermediaires
(if (= n 0) 1 (* (fa toriel (- n 1) imp) n)))
FACTORIEL > (fa toriel 3) 6 > (fa toriel 3 T) n = 3 n = 2 n = 1 n = 0 6 >
Pourimprimerpardefaut, on rempla elapremiere lignepar
> (defun fa toriel (n &optional (imp T)) ; imp dit s'il faut affi her
Comment faire lorsqu'on a plusieursarguments optionnels? On peut re ourir au mot
&key. La syntaxe de denition est pro he de elle de &optional; seule la maniere de
mettre en uvre lavariable diere.
> (defun 5+ (x &key imp (ajouter 5)) ; Definit deux arguments
(if imp (+ x ajouter))) ; optionnels. Par defaut, imp
5+ ; vaut NIL et ajouter vaut 5.
> (5+ 10)
NIL
> (5+ 10 :imp T)
15
> (5+ 10 :imp T :ajouter 5.1) ; On a modifie la valeur par defaut
15.1
>
Nous onseillons vivement l'usage du mot &key au lieu de &optional ou de
&rest;
aide en ligne. Il s'agit d'une ha^ne de ara teres qui appara^t lorsqu'on lan e la
ommande (help 'nom). La manierehabituelle d'e rire l'aide est
"Args: (x y)
Voi i e que fait la fon tion."
xxxviii CHAPTER 3. DEVELOPPEMENT DE PROGRAMMES
3.1.2 Chargement de hiers
La fon tion pour harger des hiers Xlisp est (load "fi hier"). Le hier, quidoit
obli-gatoirement se terminer par \.lsp", sera alors lu et interprete exa tement omme s'il avait
ete tape au terminal. L'extensionpardefaut est.lsp. Sitoutsederoule bien,l'interpreteur
retourne lavaleurT.
3.1.3 Deboggage
Troisoutilsde deboggagesontdisponiblesdansl'interpreteur: l'arr^eten oursd'exe ution,le
tra age des argumentset l'exe utionpas a pas. La plupartdes langagesLisples fournissent
mais leur omportement diere sensiblement d'un systeme a une autre. La des ription
en-tamee i iestproprea Xlisp-Stat.
Arr^ets lors de l'exe ution
Lemoyenleplussimpled'interromprel'exe utionestl'utilisationdelafon tionbreak. Pla er
l'instru tional'interieurdu orps d'unefon tionpermetd'examinerle ontenudesvariables.
Le programmesepoursuitdesque l'on tape ( ontinue). Voi iun exemple:
> (defun fon tion (x) (setf x (+ x 5)) (break) x)
FONCTION
> (fon tion 10)
break: **BREAK**
if ontinued: return from BREAK
1> x
15
1> ( ontinue)
[ ontinue from break loop ℄
15
Le nombrequi appara^t a gau he de \>" indiquele niveau dans lequela lieul'interruption.
break a epte une ha^ne de ara teres omme argument optionnel. Dans e as, la ha^ne
appara^tralorsde l'arr^et.
Lesysteme generera un arr^et detype breaklorsd'uneerreura l'exe ution, m^emesi ette
instru tionn'est paspla ee dansle ode, a onditionquelavariable globale*breakenable*
nevaillepasnil. Ilen va dem^eme pourlavariable *tra enable*quiimposeral'impression
d'une\tra e" desappels ayant pre ede l'interruption. baktra epermetd'imprimerles
mes-sagessi*tra enable*vautnilmalgretout. Les ommandes(debug)et(nodebug)
perme-ttent de bas ulerplusaisement lavaleurde lavariable*breakenable*.
Tra er une fon tion
Typiquement, un programme plante par e que des mauvais arguments lui ont ete fournis.
Lorsqu'ilestplantequelquepart,ilindiquedanslepromptlenumeroduniveaudedeboggage.
> (debug) ; Initialisation du mode de deboggage
T
> (defun aire (r) ; Une fon tion qui al ule l'aire d'un disque
(* r r 3.14))
AIRE
> (aire "foo") ; On donne un mauvais type d'argument
error: not a number - "foo"
1> (baktra e) Fun tion: #<Subr-BAKTRACE: #b92f8> Fun tion: #<Subr-*: #d0870> Arguments: "foo" "foo" 3.14
Fun tion: #<Closure-AIRE: #1a3190>
Arguments:
"foo"
NIL
1>
Ilfaut unpeud'experien e pourde hirerde telsmessages.
Ilestpossibleau ours del'exe utiond'utiliserunefon tionquimontrelatra edesappels
de fon tion. Cettefon tions'appelle(tra e fn)etelledonnelalistedesargumentsquisont
soumisa lafon tionfn. Un exemple:
> (tra e aire) ; On veut tra er la fon tion aire.
(AIRE)
> (aire 1 2 3 4)
Entering: AIRE, Argument list: (1 2 3 4)
error: too many arguments
1>
Poursupprimerunefon tiondela\tra e",ilfautfaire(untra e fn). Lafon tionfnsera
supprimeede lalistedesfon tions atra er. Cesdeux fon tionssont tresutilespourlo aliser
les problemes.
Exe ution pas a pas
Comme dans gdb, Xlisp-Stat pretend pouvoir observer le deroulement du programme pas a
pasau moyen de l'instru tionstep. Ce modede fon tionnementsemblereserve aMa intosh
ar ilne mar he pasdansla versiona tuellede l'interpreteur.
Niveaux de deboggage
Ilyadesniveauxenmodedebug. Ilfautetre^ apablederevenira unniveauanterieur. Cela
se fait au moyen de deux fon tions: ( lean-up)(qui remonted'un niveau)et(top-level)
xl CHAPTER 3. DEVELOPPEMENT DE PROGRAMMES
T
> (+ "foo" "ree")
error: not a number - "foo"
1> foo
error: unbound variable - FOO
if ontinued: try evaluating symbol again
2> ( lean-up)
[ ba k to previous break level ℄
1> ree
error: unbound variable - REE
if ontinued: try evaluating symbol again
2> (top-level)
[ ba k to top level ℄
>
Quelques subtilites du systeme
La memoire est quelque hose de ritique en Lisp. On en manque toujours. Voi i quelques
fon tions pourlagerer.
UninterpreteurLispadesstru turesqu'onappelle\nuds". Cesnudsserventasto ker
leselements des listes et a les oller ensemble. Au ours des manipulations,les nudssont
frequemment deliesetseretrouvent dansleslimbes: iln'estpluspossibledeles trouverpour
lesre-utiliser. Unefon tionpourramasser esnuds\de hets" s'appelleun \garbage
olle -tor". Ilyaeuunequantite onsiderabledere her hespouroptimiser e garbage olle tor,et
leslispiensensonters. Parailleurs,lefaitd'examinertouslesnudsexistantspourtrouver
eux quisont libres prend du temps quipourrait^etre onsa re au al ul. La fon tion pour
for erla olle te desde hetsest (g ). Elleestfrequemment invoqueeautomatiquement. En
eet, haque fois queXlispmanquede memoire,il faitappela ette fon tion. S'il ontinue a
en manquer,il faudra qu'ilen demandeau systeme d'exploitation. Ce iest fait par la
fon -tion(expand n) ou nestle nombre de paquetsde nudsqu'ildemandera. Habituellement,
un paquet de nuds omprend approximativement 1000 nuds. Cette fon tion est appelee
automatiquement, maison peutlefaireaussimanuellement.
Onpeutvoirles statistiquesde memoire deXlisp en faisantla fon tion(room).
Uneautre fon tionquin'estpas portable etquin'a puentrer dansles ategories de
fon -tionsde rites dans e rapport: la fon tion(system " ommande") qui exe ute la ommande
demandee. Cette ommande dependevidemment despossibilitesdu systeme d'exploitation.
3.2 Developpement de librairies ompilees
3.2.1 Ajout d'une fon tion
Ajouter une fon tion d'une librairie ompilee n'est pas aussi simple qu'au niveau Lisp. En
plus de la denition du niveau Lisp, il faut lier la fon tion de sorte que l'interpreteur aille