Anda di halaman 1dari 40

1.

Prétraitement et transformation
d’images
L'interprétation automatique d'images est utilisée, de manière limitée à cause des problèmes
de fiabilité qu'elle pose, dans tous les cas où un volume énorme de données pictoriales doivent
être comparées: trajectoires de particules élémentaires, empreintes digitales, photographies
aériennes ou de microscope électronique. De manière encore expérimentale, elle intervient
dans la commande de robots qui contrôlent leurs mouvements par une caméra de prise de vue;
par contre le contrôle optique d'une production industrielle est monnaie courante.
Les difficultés sont de nature et d'importance diverses, elles dépendent évidemment du
problème posé par l'application. En pratique il s'agira, par exemple, de reconnaître des
chromosomes d'une certaine forme dans une image fournie par le microscope, ou encore de
déterminer la présence d'un objet préalablement décrit dans un champ délimité. L'objet peut
être donné comme modèle, il s'agira alors de comparer entre elles deux (parties de) figures. Il
peut être identifiable par sa couleur ou son intensité lumineuse, mais il peut également être
structuré de manière complexe telle que l'image, même stylisée, d'un ciel couvert de nuages,
d'une molécule organique ou d'une pièce de mécanique.
Un problème se distingue immédiatement: l'image plane donnée est-elle à prendre “à la lettre”
ou faut-il la considérer comme le “codage” d'une scène à trois dimensions obtenue par
projection? L'analyse d'une projection de l'espace à trois dimensions, indépendante d'un
changement d'angle de prise de vue, est très difficile même lorsqu'on se restreint à un univers
d'objets géométriques simples. Nous reviendrons sur ce problème au chapitre suivant. Pour les
images planes, nos hypothèses sont les suivantes:

1.1 Modèle discrétisé d’image


Une image idéale est une fonction à deux variables
réelles, définie sur R2. Ses valeurs sont soit des
nombres réels mesurant une intensité lumineuse, soit
des vecteurs numériques combinant des informations
telles que: intensité, couleur, niveau de référence ou
type de texture. Ces fonctions seront supposées
bornées, dérivables par morceaux et intégrables sur
R2.
La plupart du temps, nous aurons affaire à une image
discrète, numérisée pour servir de donnée à un
ordinateur, c'est-à-dire définie sur une grille
rectangulaire finie, à coordonnées entières et à
valeurs prises dans un petit ensemble d'entiers
(déterminées, par exemple par un byte). Une image
sera dite en “noir-et-blanc” ou à deux niveaux si ses
valeurs sont binaires.
On appelle résolution le nombre d’échantillons par
unité de longueur, mesurée par exemple en dpi (dots
per inch, points par pouce). Figure 1.1 Image discrète

Il est évident que toute image idéale peut être approchée par une image numérisée, à une
tolérance près. D'autre part la notion d'image idéale permet de décrire avec amplement de
flexibilité toute image réelle, optique ou électronique. Une image sera donc un réseau, en
18 1. Prétraitement en transformation d’images

général rectangulaire, de points appelés pixels munis de valeurs numériques, scalaires ou


vectorielles discrètes. Le passage de l'image idéale (par exemple donnée mathématiquement)
à l'image discrète s'appelle l'échantillonnage (il est accompagné d'un arrondi sur les valeurs
aux points d'échantillonnage). L'opération inverse est une interpolation (ou, si elle est répétée
pour une nouvelle grille: le rééchantillonnage). En programmation, la donnée d'une image
sera du type tableau à deux dimensions.
Quant à la forme des résultats, nous serons plus ouverts. La plupart des algorithmes fourniront
une image transformée, d'autres une indication (probabilité, position) pour un objet présent. Il
s'agira alors d'une description partielle de l'image donnée, dans un langage que nous
préciserons de cas en cas. Lorsqu'une transformation a pour résultat une image, nous
supposerons l'image résultat indépendante de la donnée source (copie) bien qu'en pratique on
puisse souvent agir sur une seule et même variable globale de type tableau. Sans autre
indication, on supposera par la suite les composantes du tableau d'un type intervalle d'entiers.
On distingue en général trois sortes de traitements, aussi appelés opérateurs, d'images
numérisées:
• les opérateurs ponctuels, qui agissent sur les pixels indépendants
• les opérateurs locaux, qui définissent une nouvelle valeur de pixel en examinant son
voisinage. Deux manières de définir le voisinage existent pour les grilles rectangulaires
de numérisation.
• les opérateurs globaux, qui prennent en compte toute l'image donnée pour déterminer
chaque pixel de l'image résultat.

Pour pouvoir les présenter plus formellement, nous nous référons à un modèle de plan discret:

1.1.1 Modèle discret du plan


Les opérations de traitement d’images et l’extraction de primitives géométriques dans les
formes numérisées sont fondées sur un modèle discret du plan, étudié par J. Serra e.a. sous
le nom de “morphologie mathématique”. On y étudie les propriétés topologiques des régions
du plan; une région est représentée par des pixels noirs sur fond blanc, disposées sur une grille
rectangulaire1.
Nous n’aurons besoin, en pratique, que d’une zone rectangulaire, bornée, du plan. Les
coordonnées varient de 0 à 255 (ou une autre intervalle dont la longueur est souvent une
puissance de 2).

Exemple
1) a)Description, en Ada, d’images typiques de c×c ≅ 1 Moctet.
c: constant Positive:= 1024; -- GridSize=c*c
subtype PixelValue is Integer range 0..255;
type Image is array (0..c-1,0..c-1) of PixelValue;
1) b)Les quatre grilles 6x10 de pixels noirs ou blancs de la Fig. 1.3.

Définition
Un point du plan discret est appelé un “pixel” (picture element, pel). Sa valeur (ou sa couleur)
sera représentée par 0 (blanc) ou 1 (noir)2. Un domaine (ou une région) est un sous-ensemble
des points d’une grille; sauf indication contraire c’est l’ensemble des points noirs.

1. J. Serra utilise de préférence une grille hexagonale dont les pixels sont disposés de manière
équidistante: la distinction entre 4-connexité et 8-connexité est alors caduque.
1. Prétraitement et transformation d’images 19

Exemple
Codage des quatre images de la Fig. 1.3 avec la convention: blanc = 0 et noir = 1.
0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0
0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0
0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0
0 1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0
1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0
1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0

1.2 Traitements locaux

1.2.1 Traitement ponctuel: le seuillage


Parmi les valeurs possibles attribuées aux pixels d'une image, on veut parfois sélectionner une
plage plus restreinte, par exemple toutes les intensités au-dessus d'un seuil θ parmi les niveaux
0 à 255. L'image à deux niveaux ainsi obtenue représente la zone sélectionnée (et son
complément); l'information qu'elle contient est fortement réduite (figure 1.2), mais cela peut être
souhaitable par exemple en lecture optique. Le choix du seuil θ doit être judicieux; on essayera
d'éviter au mieux les effets parasites de variations d'intensités proches du seuil. L'histogramme
des valeurs de pixel peut être très utile à cet effet.

Figure 1.2 Image à 16, 8, 4 et 2 niveaux. La réduction du nombre de niveaux est obtenue par
arrondis successifs; l'image à 2 niveaux correspond à un seuillage avec θ = 1/2

Un autre traitement ponctuel, utile pour la visualisation, est le réhaussement des intensités plus
ou moins contrastées dans l'image donnée, au moyen d'une égalisation de l'histogramme
(figure 1.3).

2. En pratique, chaque pixel sera codé par un octet, une valeur entre 0 et 255, ou plus
généralement par un entier, voire un code de couleur RGB.
20 1. Prétraitement en transformation d’images

Figure 1.3 Egalisation d'histogramme


image d'entrée et son histogramme concentré dans les noirs
image de sortie et son histogramme égalisé.

1.2.2 Traitements préliminaires: l'atténuation du bruit


La qualité d'une image donnée est généralement insuffisante pour qu'un algorithme de
décomposition, voire de reconnaissance d'éléments constitutifs spécifiés, puisse s'appliquer de
manière stable. Les sources d'irrégularité sont des déformations du domaine et des fluctuations
parasitaires des valeurs.
Ces dernières sont particulièrement gênantes; surtout lorsque leur variabilité locale est très
rapide, il est d'usage de les grouper sous le générique de “bruit” de fond. On suppose
généralement que le bruit provient de sources diverses et indépendantes, c'est par conséquent
une fonction aléatoire qui se superpose additivement à l'image idéale. Un moyen d'atténuer ce
bruit consiste à superposer plusieurs images de la même source. L'amplitude de la fonction
idéale est alors multipliée tandis que les bruits, peu corrélés entre les diverses copies,
s'intensifient beaucoup moins. Plus précisément, soient N copies de f présentent chacune un
bruit ∆f de valeur moyenne nulle et d'écart quadratique moyen σ mesurant son intensité:

σ = Var ∆f
On obtient par superposition:

N⋅f pour l'image moyenne

N ⋅ Var ∆f = σ N pour l’écart


L'amplitude relative du bruit est ainsi:

σ N 1
------------ , soit réduite de -------- .
f⋅N N
L'opération typique ici est l'addition d'images discrètes, point par point. Ceci suppose
évidemment N copies parfaitement calées (repérées afin d'être superposées sans décalage);
1. Prétraitement et transformation d’images 21

nous verrons d'autres méthodes évitant cette contrainte et plus efficaces, du moins dans le cas
où l'on a des informations concernant la nature du bruit.

1.2.3 Traitement local: le lissage


Reprenons le problème de l'élimination d'un bruit caractérisé par des “points” clairs ou foncés,
distribués uniformément mais aléatoirement. Un tel phénomène s'estompe presque totalement
lors de la transformation suivante. Soient f(i, j) les valeurs de l'image discrète donnée, au
voisinage du point ( x, y ) ( i – x + j – y ≤ 1 ) . Soit:


1
M = --- f(i, j)
4
i–x + j–y ≤1
M est la moyenne sur les points adjacents (horizontalement ou verticalement) à (x, y):
remplacer f(x, y) par M, en chaque point de la grille. Dans les bords du rectangle, on utilisera
éventuellement une expression différente pour M. Cette opération est locale parce qu'elle
n'affecte, en chaque point, qu'un voisinage de celui-ci; en particulier elle ne requiert pas
nécessairement le stockage, en mémoire vive, de toute l'image à traiter.
L'effet de la transformation est un lissage où aucun point individuel de la grille ne subsiste.
L'effet de flou qui en résulte peut être limité, et les contrastes conservés, par d'autres variantes
qui consistent à remplacer f(x, y), par exemple, par:

1
--- ( f(x, y) + M )
2
ou par:
si f(x, y) - M  ≥ ε alors M sinon f(x, y)
selon les irrégularités que l'on désire éliminer. Une différence est à noter entre notre calcul de
M, sur un voisinage en carreau, et le choix, également courant, d'un voisinage carré (de côté
3 ou plus) centré en (x, y) et parallèle aux axes de coordonnées. Tel est le cas, par exemple,
pour la moyenne M suivante:


1
M = --- f(i, j)
8
i–x ≤1
j–y ≤1
( x, y ) ≠ ( i, j )
y y

3 2 1 2
4 P 0 4 P 0
5 6 7 6

x x
Figure 1.4Deux voisinages du point P. Le voisinage carré contient 8 points voisins de
P, numérotés de 0 à 7. Le voisinage en carreau est formé des 4 voisins pairs.

Une difficulté supplémentaire provient du fait que les nouvelles valeurs doivent être arrondies
pour entrer dans la même gamme que les valeurs de l'image digitalisée originale. Par exemple,
pour des images en noir et blanc (noir = 1), on choisira comme nouvelle valeur de f(x, y):

si α.f(x, y) + β.M ≥ 1 alors 1 sinon 0.


22 1. Prétraitement en transformation d’images

Figure 1.5 Lissage avec une moyenne sur un voisinage carré de côté 3, 5, 9. Un effet similaire
peut être obtenu en itérant l'opérateur de lissage de taille 3x3.
Avec α = 1 , β = 0 on a l'identité; à l'autre extrême α = 0 permet de paramétrer, à l'aide de β, le
pourcentage du voisinage d'un point (x, y) suffisant pour entraîner la modification de f(x, y).
Lorsqu'on spécifie localement un opérateur de lissage, on fait bien de s'interroger sur ses
propriétés: est-il utile de l'itérer ou, au contraire, l'opération est-elle stationnaire? La fenêtre
peut-elle être déplacée dans un ordre quelconque, en réutilisant des valeurs déjà partiellement
modifiées? Le voisinage a-t-il la bonne forme (isotropique ou non) et la taille suffisante pour
compenser le bruit identifié? Les décisions seront également prises en fonction du traitement
ultérieur prévu. Par exemple s'il est important de conserver toutes les courbes fermées et les
domaines connexes dans l'image à analyser, on renforcera les lignes ténues en favorisant
l'épaississement des lignes pleines plutôt que de les estomper.

1.2.4 Traitement local: le gradient


Au lieu de régulariser localement l'image par un calcul de moyenne, on peut viser la propriété
contraire: mettre en évidence des variations locales. Ainsi un voisinage en carreau peut être
utilisé pour déterminer des “dérivées partielles” discrètes:

1
f x(x, y) = --- ( f(x + 1, y) – f(x – 1, y) )
2
1
f y(x, y) = --- ( f(x, y + 1) – f(x, y – 1) )
2
o
Un voisinage carré permet de choisir d'autres directions, à ± 45 :

1
f x + y(x, y) = --- ( f(x + 1, y + 1) – f(x, y) )
2
1
f x – y(x, y) = --- ( f(x, y + 1) – f(x + 1, y) )
2
La norme du gradient ainsi obtenu vaut, suivant le cas, et à un facteur près:

f(x + 1, y) 2 + f(x – 1, y) 2 + f(x, y + 1) 2 + f(x, y – 1) 2 – 2f(x + 1, y)f(x, y + 1) – 2f(x, y + 1)f(x, y – 1)


ou

f(x + 1, y + 1) 2 + f(x, y + 1) 2 + f(x, y) 2 + f(x, y – 1) 2 + 2f(x + 1, y + 1)f ( x, y ) – 2f(x, y + 1)f(x + 1, y)


C'est le remplacement de f(x, y) par une telle norme que l'on appelle “prendre le gradient de
l'image”. Il s'agit d'un traitement qui met en valeur les arêtes et les changements vifs de niveau
de gris. Tel quel, il est extrêmement sensible au bruit à variation rapide; il est donc précédé et
en général combiné directement avec un lissage.
1. Prétraitement et transformation d’images 23

D'autres variantes de la “dérivation discrète” sont fournies par le “Laplacien”:

∆f = f xx + f yy = f ( x + 1, y ) + f ( x, y + 1 ) + f ( x – 1, y ) + f ( x, y – 1 ) – 4f ( x, y )

ou par des opérateurs plus sélectifs. Au lieu du gradient en norme on prendra, par exemple, le
gradient directionnel fx afin de mettre en évidence des passages clair-foncé aux confins de
régions différentes, juxtaposées horizontalement.
Le gradient se généralise à la détection de lignes à pente pré-spécifiée; le choix du voisinage
de travail et l'ajustement des coefficients pour les valeurs considérées de f sont immédiats.

1.2.5 Opérateurs linéaires


Une notation courante et pratique pour exprimer une transformation locale linéaire est celle du
masque de coefficients. Le masque est une matrice dont les dimensions sont données par le
voisinage considéré; la case centrale du masque coïncide avec le pixel qui prendra la nouvelle
valeur calculée. Enfin, le calcul de la nouvelle valeur se résume à la somme des valeurs de
chaque pixel du voisinage, multiplié par le coefficient correspondant dans le masque.
La figure 1.6 montre les masques classiques de taille 3×3. La composition d'opérateurs
linéaires est encore linéaire et peut, par conséquent, également être représentée par un
masque. Par contre, le module du gradient n'est plus linéaire. De même, les huit masques de
Freemann sont normalement utilisés pour extraire la direction maximale de contraste au
voisinage du point considéré; cette direction peut être codée à l'aide d'une valeur comprise
entre 0 et 7 (comme dans la figure 1.4).

1.2.6 Opérateur sur les images binaires (à deux niveaux de gris)


Une notion essentielle en topologie est celle de voisinage. Nous examinerons les voisins
directs d’un point dans une grille afin de définir formellement les notions de chemin et de
connexité.

Définition (voir Fig. 1.4)


Le 4-voisinage d’un point P=(x,y) est l’ensemble des 4 voisins directs de code pair (selon
Freeman) autour de P: (x+1,y), (x,y+1), (x-1,y) et (x,y-1).
Le 8-voisinage d’un point P=(x,y) est l’ensemble des 8 voisins, codés selon Freeman de 0 à 7,
de coordonnées (x+i, y+j) avec i≤1, j≤1 et i +j ≠ 03.

Remarque
Deux points (x,y) et (x+i, y+j) sont voisins ssi Max{i, j} = 1.

Remarque
Le 4-voisinage de P est aussi appelé le voisinage pair de P; deux points appartenant l’un au
voisinage pair de l’autre sont dits voisins pairs.

Définition
Un chemin est une suite de points Po, ..., Pn de la grille, telle que Pi-1 est voisin de Pi pour tout
i≤n.

Définition
Un chemin pair est un chemin Po, ..., Pn où Pi-1 est un voisin pair de Pi, pour tout i≤n.

3. En topologie usuelle, on inclut le point P= (x,y) parmi ceux de son voisinage; de plus, tout
ensemble contenant un voisinage est également un voisinage ! Ici, on considère
exclusivement les voisins directs, on y inclut parfois le point P.
24 1. Prétraitement en transformation d’images

a) Masques du gradient

1
1 1
Gx = -1 0 1 Gy = 0
2 2
-1

b) Masques de PREWITT et SOBEL

-1 0 1 1 1 1 -1 0 1 1 2 1
P = -1 0 1 P = 0 0 0 S = -2 0 2 S = 0 0 0
x y x y
-1 0 1 -1 -1 -1 -1 0 1 -1 -2 -1

c) Masques de FREEMAN

-1 1 1 1 1 1 1 1 1 1 1 1
H = H = H = H =
0 -1 -2 1 1 -1 -2 1 2 1 -2 1 3 1 -2 -1
-1 1 1 -1 -1 1 -1 -1 -1 1 -1 -1

1 1 -1 1 -1 -1 -1 -1 -1 -1 -1 1
H = H = H = H =
4 1 -2 -1 5 1 -2 -1 6 1 -2 1 7 -1 -2 1
1 1 -1 1 1 1 1 1 1 1 1 1

d) Masques du Laplacien et de la moyenne

0 -1 0 1 1 1
1
L = -1 4 -1 M = 1 1 1
9
0 -1 0 1 1 1
Figure 1.6 Masques pour les opérateurs linéaires locaux.

Exemple
Dans l’exemple de la Fig. 1.3, les lettres N et M peuvent être parcourues à l’aide d’un chemin
(mais pas par un chemin pair). La lettre O est un exemple de chemin fermé (Pn=Po).
Deux chemins peuvent se croiser sans avoir de pixel commun. Pour les chemins pairs cela
n’est pas possible; mais on observe plus précisément:

Définition
Deux chemins se croisent s’ils relient les angles opposés complémentaires d’une grille
rectangulaire.
1. Prétraitement et transformation d’images 25

Théorème de Rolle discret: Si deux chemins se croisent alors ils ont au moins un pixel commun
si l’un des deux est pair.

Remarque
Une variante de ce théorème affirme que si un chemin relie l’intérieur à l’extérieur d’un chemin
fermé (Po=Pn), alors ils ont un pixel commun si l’un d’eux chemins est pair. Plus précisément:
Théorème de Jordan discret: Un chemin fermé découpe le plan discret en régions 4-connexes.

Remarque
Si le chemin fermé (Po=Pn) est simple (Pi≠Pk pour 1≤i≤k≤n) et étalé (Pi et Pk ne sont pas voisins
si |i-k|>2), alors il sépare le plan en deux compostantes simplement 4-connexes: l’une est
bornée et appelée l’intérieur tendis que l’autres est l’extérieur.
On a aussi la propriété duale: un chemin fermé pair sépare le plan discret en régions
simplement connexes.

1.2.7 Topologie discrète

Définition
a) Un domaine D, sous-ensemble des pixels d’une grille rectangulaire, est 8-connexe si
deux points quelconques de D peuvent être reliés par un chemin entièrement contenu
dans D.
b) D est 4-connexe si deux points quelconques de D peuvent être reliés par un chemin pair
contenu dans D.
c) Un domaine D est simplement connexe si pour deux points quelconques de D et deux
chemins reliant ces extrêmités, tous les points de la grille, entourés par ces chemins, sont
entièrement contenus dans D.

Remarque
Un domaine connexe sans trou est simplement connexe; avec un trou (un lac dans une île), il
est doublement connexe. Avec n-1 trous il est n-connexe; en particulier 1-connexe étant
synonyme de “simplement connexe”.

Définition
Le bord d’un domaine connexe D est l’ensemble des pixels de D, voisins d’un pixel du
complément de D. Le bord pair ou 4-bord de D est l’ensemble des pixels de D, dont un voisin
pair appartient au complément de D.

Remarque
Le bord pair est un sous-ensemble du bord complet; on dit que le 4-bord est contenu dans le
8-bord.
On précise parfois qu’il s’agit du bord intérieur de D, le bord extérieur étant le sous-ensemble
(analogue) du complément de D.

Définition
Un point de D qui ne fait pas partie du bord s’appelle point intérieur de D; si D n’a aucun point
intérieur, il se confond avec son bord et on dit que D est mince.
26 1. Prétraitement en transformation d’images

1.2.8 Les opérations sur les domaines

Définition
L’érosion d’un domaine D est la transformation qui consiste à ôter le bord de D.
L’érosion est un opérateur local, non linéaire de masque 3x3, qui consiste à faire passer un
pixel noir à blanc s’il a un voisin blanc parmi ses 8 voisins directs.
On distingue la 8-érosion de la 4-érosion, ou érosion paire qui, elle, ne supprime que le bord
pair de D. L’érosion tend à couper les isthmes et à supprimer les barbules du domaine donné.
L’érosion d’un domaine mince donne l’ensemble vide, c’est-à-dire une grille blanche.

Définition
La dilatation est l’opération qui consiste à ajouter à D son bord extérieur. La fermeture de D est
un lissage qui consiste en une dilatation, suivie d’une érosion.
L’érosion du complément de D est équivalente à la dilatation de D, on dit que ces deux
opérations sont duales l’une de l’autre.
La fermeture tend à combler les fjords et les détroits d’un domaine donné, sans en modifier
beaucoup la surface.
Ces effets des opérateurs d’érosion et ses dérivés sont parfois souhaitables comme
prétraitement; ils ont cependant le défaut de modifier profondément la topologie des domaines
contenus dans une image.

1.2.9 Opérations conservant la topologie

Définition
Un amincissement est un érosion partielle qui supprime les points du bord seulement si la
connexité n’est pas modifiée (c’est-à-dire chaque composante connexe le sera encore, idem
pour n-connexe, etc.). De plus, il conserve la forme des parties minces (bras, ligatures).

Exemple
Il y a plusieurs variantes d’opérateurs d’amincissement. Par exemple celui de Zhang et Suen
introduit deux critères pour décider si un point P doit être éliminé. Appelons vo, v1, .., v7 les
valeurs des huit pixels voisins de P et considérons d’abord les contraintes de bord ponctuelles.
Non seulement v0,...,v7 doivent contenir une valeur nulle (pour que P soit un point du bord),
mais cette condition est renforcée:
- parmi v0, ..,v7 il y a au moins deux valeurs nulles et au plus 6. Cette contrainte évite
d’éroder le fond d’un fjord ou la pointe d’une presqu’île.
- les valeurs nulles parmi v0,...,v7 sont contiguës; il en découle que les valeurs non-nulles
(pixels noirs) le sont également. Cette contrainte inhibe l’érosion de points doubles du
bord, ce qui “couperait” le domaine.
En outre, les contraintes de séquentialité évitent de supprimer les paires critiques de pixels
voisins, appartenant au bord et safisfaisant les contraintes séparément. Une paire de tels pixels
ne doivent pas être ôtés simultanément. Zhang et Suen proposent de traiter alternativement:
- tous les pixels au sud, à l’est ou au nord-ouest, c’est-à-dire pour lesquels
v0*v2*v6=v0*v4*v6=0;
- tous les pixels au nord, à l’ouest ou au sud-est, c’est-à-dire où v0*v2*v4=v2*v4*v6=0.
L’amincissement ne peut pas être réalisé par un opérateur local ayant un masque de 3x3. Soit
le masque doit être agrandi pour pouvoir examiner un voisinage de rayon 2, soit une
1. Prétraitement et transformation d’images 27

séquentialisation est nécessaire dans le traitement des pixels. Une solution extrême est le
parcours séquentiel de tous les pixels du bord accompagné du traitement avec un masque 3x3.
Il suffit que la séquentialisation force le traitement, l’un après l’autre, de chaque paire de pixels
critiques. Pavlidis a donné plusieurs variantes différentes d’algorithmes d’amincissement.

Figure 1.7 Résultat de deux algorithmes de squelettisation par érosion (Pavlidis 82)

Remarque
Comme pour l’érosion, il faut décider a priori si on s’intéresse à la 8-connexité du domaine
aminci ou à la 4-connexité; l’opérateur utilisé sera différent !

Définition
La squelettisation est un amincissement itéré, aboutissant à un domaine mince de même
topologie, appelé le squelette.
Selon l’opérateur d’amincissement choisi on aura un squelette 4-connexe ou 8-connexe; en
outre, l’opérateur peut introduire une orientation, favorisant une séquence de parcours
particulière. Le squelette résultant reste pour l’essentiel univoque.
Une variante de squelettisation consiste à mémoriser, pour chaque pixel éliminé, le numéro de
l’itération courante (cela peut se faire de proche en proche et revient à noter la distance entre
le pixel et le bord). Chaque point du squelette conserve le numéro d’itération où il est devenu
stationnaire. A partir de cette information la restitution du domaine est facilitée: il suffit de faire
croître, à partir de chaque point de squelette, un “cercle” de rayon borné par le numéro
d’itération.

1.3 Transformations globales

1.3.1 Transformation de Fourier


Les techniques habituelles de traitement de signaux offrent une pléthore de fonctions de
prétraitement. L'exemple de l'électro-cardiogramme (image à une dimension) se prête bien à
l'illustration des techniques de filtrage, généralisables aux images à deux dimensions. Pour
commencer, si les électro-cardiogrammes enregistrés présentaient des oscillations gênantes
mais peu significatives, de période irrégulière mais très courte, un filtrage passe-bas aurait tôt
fait d'éliminer ce résidu de “friture”. Mais la construction de filtres adaptés permet également la
détection de signaux périodiques de forme particulière donnée. C'est ce que montre la théorie
de la transformation de Fourier.
Un signal peut-être décrit soit “temporellement”, par les valeurs d’une quantité u fonction du
temps t, u(t); ou dans le domaine des fréquences, en donnant son amplitude F (généralement
28 1. Prétraitement en transformation d’images

un complexe comprenant aussi la phase du signal) en fonction de la fréquence ν ,


F ( ν ), – ∞ < ν < ∞ . On peut penser à u(t) et F(ν) comme étant deux représentations différentes
de la même fonction. On passe de l’une à l’autre par la transformée de Fourier.

– 2 πiνt u ( t ) dt
F( ν) = ∫e
–∞


u(t) = ∫e
2πiνt F ( ν ) dν

–∞

Remarques
F ( ν )e – 2πiνt est la composante de u de fréquence ν.
La transformée F de u a la propriété de décomposer u en une superposition continue de
signaux harmoniques.
Les conditions d'existence des intégrales ne sont pas évoquées ici; dans tous les cas pratiques
on travaille avec des approximations qui, elles, satisfont aux conditions d'intégrabilité requises.

1.3.2 Filtrage et corrélation


Un filtre est un dispositif qui transforme un signal; favorisant certaines fréquences et en
amortissant d'autres, son effet est aisé à expliquer sur la transformée de Fourier du signal. Par
exemple un filtre passe-bas idéal supprime toutes les fréquences au-dessus d'un seuil ν 0 .
Même une réalisation fort approximative d'un tel filtre a un effet spectaculaire connu par tout
amateur d'électrophonie.
Notre définition d'un filtre est donc une fonction G(ν) donnant divers poids aux fréquences ν.
Un signal u est transformé par le filtre G, multiplicativement sur la transformée F de u. Notre
définition inclut ainsi le cas du filtrage de fréquences où G(ν) est réel et non négatif. Par contre,
les valeurs complexes de G autorisent l'interprétation qui nous intéresse; il nous faut toutefois
rappeler le théorème de convolution

– 2 πiνt u ( t ) dt
siF(ν) = ∫e
–∞


– 2 πiνt v ( t ) dt
etG(ν) = ∫e
–∞


– 2 πiνt p ( t ) dt
alorsF(ν)G(ν) = ∫e
–∞


avec p(t) = ∫ u(τ)v ( t – τ ) dτ
–∞

On appelle p=u*v le produit de convolution des fonctions u et v; la transformée de Fourier


d'un produit de convolution est donc le produit arithmétique des transformées.
Considérons maintenant un signal v(-τ) qui, au temps τ, a l'élongation de la forme de référence
donnée (on prendra pour v ce signal inversé par rapport au temps). La fonction v(t-τ) décrit le
même signal, mais déplacé d'une période t arbitraire. On pourra dès lors comparer les signaux
1. Prétraitement et transformation d’images 29

u(τ) et v(t-τ); le produit de convolution u*v peut notamment être interprété comme une
corrélation p(t) des deux signaux, dépendant du paramètre t de décalage. En particulier p(to)
est maximum pour la valeur to qui rapproche le plus u(τ) et v(to-τ); en effet la distance entre u
et v:
∞ ∞ ∞ ∞

∫ ( u(τ) – v ( t – τ ) ) 2 dτ = ∫ u 2(τ) dτ + ∫ v 2(τ) dτ – 2 ∫ u(τ)v ( t – τ ) dτ


–∞ –∞ –∞ –∞

= cons tan te – 2p(t)


est minimum pour t = to.

Remarquons que si le signal observé u laisse apparaître une périodicité (du moins sur le
tronçon recueilli), il en ira de même pour p=u*v. La détection d'un signal périodique de la forme
v(t-τ) dans le train d'ondes u(τ) est ramenée à la reconnaissance d'un maximum périodique
dans le produit de convolution p. Ce produit est obtenu, en principe, par un filtre complexe (la
transformation de Fourier G du signal de référence v) appliqué à la donnée u. Un tel filtre
suppose, outre la modification d'amplitude, un déphasage donné par le coefficient complexe
G(ν) à certaines fréquences ν; sa construction physique pose un problème majeur et il faut
peut-être s'en tenir aux méthodes programmées, d'ailleurs relativement efficaces.
Cet exemple devait mettre en valeur un prétraitement typique, de corrélation globale, dont le
résultat est pratiquement complet: il ne reste qu'à examiner les maxima de p=u*v.

1.3.3 Transformée de Fourier bidimensionnelle et corrélation globale


La corrélation globale réalisée en analyse de signaux et expliquée par la transformée de
Fourier se généralise aux fonctions à deux variables que sont les images idéales. Ces fonctions
doivent satisfaire à des conditions mathématiques pour la convergence des intégrales, sur
lesquelles nous n'insisterons pas: en pratique une image est toujours bornée, à support fini et
approchée par une fonction f continue (voire dérivable) par morceaux. La transformée
bidimensionnelle de Fourier Ff de f est donnée par:

– 2π ( νx + µy )i dx dy
F f(ν, µ) = ∫ f(x, y)e
R2

Les valeurs de Ff sont alors les coefficients du développement de Fourier de f:

2π ( νx + µy )i dν dµ
f ( x, y ) = ∫ Ff(ν, µ)e
R2

Comme dans le cas d'une variable, si f est réelle alors:

F f(ν, µ) = F f(– ν, – µ )) et F f(ν, µ) = F f(– ν, – µ)

où F f est la conjuguée complexe et F f est le module de Ff.

Ainsi:

2π ( νx + µy )i + F f(ν, µ)e 2π ( – νx + µy )i ) dν dµ
f ( x, y ) = ∫ ∫ ( Ff(ν, µ)e
D

2π ( νx + µy )i ) dν dµ
=2 ∫ ∫ Re ( Ff(ν, µ)e
D
30 1. Prétraitement en transformation d’images

Figure 1.8 Une image bidimensionnelle et sa transformée de Fourier.

D est une moitié de R2, par exemple:


D = {(ν, µ)  µ ≥ 0} et

l'intégrande Re ( F f(ν, µ)e 2π ( νx + µy )i ) = F f(ν, µ) cos [ ϕ 0 + 2π ( νx + µy ) ]

est la partie réelle de l'exponentielle complexe. On voit qu'il s'agit d'une sinusoïde de période:

ν
 ----------------- µ
-, ------------------
 ν 2 + µ 2 ν 2 + µ 2

dont la direction de propagation est donc donnée par (ν, µ), la longueur de la période (dans la
même direction) par

1
----------------------
ν + µ2
2

et la phase ϕo par l'argument de Ff (ν, µ).

L'interprétation de la transformée Ff est immédiate; pour chaque direction

µ
--- fixée, F f(ν, µ) = G ( ν 2 + µ 2 )
ν
est le coefficient d'un développement de Fourier unidimensionnel de

y µ
f ( x, y ) = g ( x 2 + y 2 ) de direction --- = ---
x ν
dans le sens transversal νx + µy = constante, f(x, y) ne varie pas.
Des arêtes, segments de droite ou frontières entre intensités très différentes, parallèles à la
direction fixée µ/ν ressortiront dans Ff comme des fortes composantes aux fréquences
ν 2 + µ 2 élevées.
1. Prétraitement et transformation d’images 31

Figure 1.9 Les fréquences prépondérantes dans le spectre de Fourier, dues aux
arêtes franches dans l'image.

Si plusieurs traits parallèles sont équidistants dans l'image f, cette distance d se présentera
comme une période marquée d'une valeur F f(ν, µ) prépondérante au point ν 2 + µ 2 = 1 ⁄ d 2
L'utilité de la transformée de Fourier de f n'est pas limitée à l'interprétation directe de Ff. Au
contraire, une application importante est le traitement global de f par l'intermédiaire de Ff. Tel
est le cas pour le filtrage passe-bas éliminant les fréquences élevées dans toute direction. La
réciproque d'une transformée Ff ainsi écourtée aura des arêtes estompées et un grain amorti,
voire complètement lissé. Dans le même sens, mais en atténuant les fréquences les plus
basses, on peut limiter les variations moyennes d'intensité et obtenir une image adoucie.
Souvent on préfère, au contraire, renforcer les contrastes ou les lignes de séparation: on
l'obtient en munissant les coefficients Ff (ν, µ) de facteurs adéquats. Notons l'analogie du
traitement (local) par le gradient avec celui (global) qui consiste à favoriser les fréquences
élevées en multipliant F f(ν, µ) parν 2 + µ 2 avant de reformer une image comparable à f.

Figure 1.10 Une application de la transformée de Fourier à la restauration d'une


image “bruitée” (a). Le spectre de Fourier (b) fait apparaître les périodes du bruit; en
annulant ces composantes du spectre, la transformée inverse produit l'image
“filtrée” (c).
32 1. Prétraitement en transformation d’images

Une autre application indirecte est la confrontation globale de f avec un patron g à localiser
dans l'image f. Comme dans le cas d'une variable, le produit de convolution

f*g(x, y) = ∫ ∫ f(ξ, η)g(x – ξ, y – η) dξ dη


permet de définir la corrélation mutuelle de f et g en fonction d'un décalage respectif (x, y):

C f, g(x, y) = ∫ ∫ f(ξ, η)g(ξ – x, η – y) dξ dη


C f, g(x, y) = f*g si h(x, y) = g(– x, – y) est la réflexion centrale de g; la transformée de Fourier
de Cf, g est donc le produit des transformées de l'image f et du patron g réfléchi,
respectivement. D'autre part le carré moyen de la distance entre f et le patron g déplacé est
donné par:

∫ ∫ f (ξ, η) dξ dη – 2Cf, g(x, y) + ∫ ∫ g (ξ – x, η – y) dξ dη = E – 2C f, g(x, y)


2 2

où E est l'énergie totale de f et g, indépendante de x et y.


La meilleure superposition de l'image f et du patron g est obtenue aux points (x, y) où Cf, g est
maximum. Par le même raisonnement, l'autocorrélation Cf, f de f présentera des extrema aux
points (x, y) qui marquent une périodicité approximative de f; ceci est consistant avec notre
interprétation directe de Ff puisque la transformée de Fourier Cf, f, est exactement
F f(ν, µ)F f(– ν, – µ) = F f(ν, µ) 2 .

1.3.4 Réalisations optique et numérique de la transformée de Fourier


Les systèmes optiques sont extrêmement efficaces puisque l'image complète est traitée
simultanément, contrairement à un balayage accompagné d'élaboration séquentielle. Nous ne
présenterons pas les nombreuses techniques possibles pour réaliser optiquement la
corrélation de deux images ou leur transformée de Fourier (en lumière monochromatique
cohérente). Les techniques développées sur la base de la représentation de la transformée
complexe (énergie et phase) de Fourier sont groupées sous le terme général d'holographie.
Dans ce paragraphe nous considérerons uniquement la réalisation numérique (algorithme
FFT).
Afin de montrer les limites de validité de la discrétisation d'une image idéale f, nous rappelons
l'énoncé d'un théorème de Shannon, quelquefois appelé théorème d'échantillonnage. Ce
nom suggestif provient de ce qu'il donne une condition suffisante pour qu'un nombre fini de
points (échantillons de f) détermine exactement la transformée Ff, et par suite f toute entière.
Notre illustration se bornera aux images unidimensionnelles.

Soit F f(ν) = ∫ f(x)e


– 2πiνx dx la transformée de f,

satisfaisant à l'hypothèse suivante: Ff (ν) = 0 pour ν  > b.

On dira que f a une bande de fréquences bornée par b; on peut en effet retrouver f par une
intégrale de Fourier définie sur un intervalle borné:
b
f(x) = ∫ Ff(ν)e
2πiνx dν

–b
1. Prétraitement et transformation d’images 33

D'autre part Ff peut être obtenu dans ce cas à l'aide d'une série de Fourier plutôt qu'une
intégrale:

∞ – 2πiνn
1 n ------------------
-
F f(ν) = ∑ -)e 2b si ν  < b
------ f(-----
2b 2b
n = –∞

Dans les cas pratiques f a un support borné par la taille a de l'image:

f ( x ) = 0 si x > a
Par conséquent:

n
f(------) ≠ 0 seulement pour n ≤ k = 2ab et
2b

k – 2πiνn
1 n ------------------
-
F f(ν) = ∑ -)e 2b
------ f(-----
2b 2b
n = –k

1.3.5 Théorème d’échantillonage


Réciproquement on démontre, en simplifiant l'intégrale de Fourier terme à terme, que f est une
superposition de fonctions primitives:
k


n
f(x) = f(------)S(2bx – n) avec:
2b
n = –k

sin πy
S ( y ) = -------------- pour y ≠ 0 et S(0) = 1.
πy
1

0.8

0.6

0.4

0.2

-4 -2 2 4

-0.2

Figure 1.11 La fonction Sinc, utilisée pour restituer une fonction


échantillonnée.

En conclusion, la discrétisation de f avec un pas de 1/2b, où b est la largeur de bande des


fréquences de f, permet une restitution exacte de l'image idéale f. Pratiquement: si l'on ne
s’intéresse pas aux fréquences ν > b dans l'image fournie, alors un pas de discrétisation de
1
l'ordre de – ------ est amplement assez fin. Inversément il est illusoire de vouloir retrouver une
2b
information concernant des fréquences élevées dans une image discrétisée à trop faible
résolution. L'intuition se voit ainsi confirmée par le résultat ci-dessus, connu sous le nom de
théorème d'échantillonnage de Shannon.
Indiquons l'existence de routines (FFT: Fast Fourier Transform) très efficaces pour le calcul
numérique des transformées de Fourier. Ces programmes utilisent, en gros, une formule
d'intégration par trapèzes sur un intervalle I. I doit contenir toutes les valeurs non-nulles de la
fonction donnée f ce qui permet de traiter I comme une période fictive de f. D'autre part I est
34 1. Prétraitement en transformation d’images

subdivisé en n intervalles de même longueur h (le pas de l'intégration numérique). Dans ces
k
conditions la transformée Ff est représentée par une série de valeurs Ff (ν) où ν = ------ avec k
nh
= 0, 1, ..., n.

n⋅h
2 – 2πiνx
F f ( v ) = ----------
n⋅h ∫ f(x) ⋅ e dx
0

∑ f ( jh )e –2 πiνjh
2
≅ ---
n
j=1
n

∑ f ( jh )c ( k, j, n )
2
= --- i ≤ j, k ≤ n
n
j=1
Pour ν = 0 , l'expression est légèrement différente:

∑ f ( jh )
1
F f(0) = ---
n
j=1

L'introduction des coefficients complexes

kj
– 2 πi ----- 2πkj 2πkj
c ( k, j, n ) = e n = cos ------------ – i sin ------------
n n
suggère une optimisation, particulièrement efficace lorsque n est une puissance de deux (ou la
somme d'un petit développement binaire):

c ( k, j, n ) = c ( j, k, n )

2πi
--------
c ( 1, 1, n ) = e n
c ( k + m, j, n ) = c ( k, j, n ) ⋅ c ( m, j, n ) , produit des nombres complexes.
De plus c ( 1, 1, n ) est la n-ième racine complexe de l'unité; la transformée de Fourier est ainsi
représentée comme un produit matriciel, les éléments de la matrice de transformation étant
construits itérativement comme produit de certaines racines de l'unité.

1.3.6 Transformée de Hadamard


La transformation de Fourier a deux propriétés qui la distinguent. D'abord elle est inversible,
c'est donc qu'elle conserve toute l'information contenue dans l'image donnée. Du moins en
principe, il s'agit d'un codage fidèle. Ensuite le codage effectue une sélection de
caractéristiques interprétées géométriquement. Il s'agit de périodicités dans le plan de l'image,
chiffrés en fréquences, directions et amplitudes. Une réduction d'information éliminant une
partie de ces caractéristiques est donc naturelle et sélective à souhait.
D'autres transformations classiques ont des propriétés analogues. Citons la transformée
d'Hadamard dont l'implantation digitale est manifestement idéale. La définition de Hf à partir de
la donnée f est en effet sujette à l'hypothèse suivante, propre à la discrétisation:

f ( x ) est définie pour x = 0, 1, 2, …, 2 N – 1


1. Prétraitement et transformation d’images 35

De même la transformée H f(ν) est définie sur un intervalle subdivisé en 2 N parties de pas
uniforme, ν = 0, 1, 2, …, 2 N – 1 .

( 2N – 1 )
H f(ν) = 2 1 – N ∫ f ( x ) ( – 1 )x*ν dx
0
N–1 N–1
où x*ν = ∑ x [ i ]ν [ i ] et x = ∑ x [ i ]2 i
i=0 i=0
Dans Hf les valeurs de f apparaissent donc avec un signe dépendant du nombre de bits
communs dans la représentation de x et ν en base deux. L'itération de H donne l'identité, par
contre l'interprétation des “fréquences” est plus subtile [Gonzalez p.115].
Un autre principe d'extraction de caractéristiques globales d'une image consiste à former les
moments statique, dynamique et d'ordres supérieurs de f considérée comme une distribution.
On peut normaliser les moments relativement aux axes de coordonnées en repérant le centre
de gravité et les interpréter comme des invariants numériques de la figure. L'information ainsi
retenue est plutôt qualitative et permet au plus une classification grossière des images. Elle
peut rendre service dans la comparaison de caractères d'imprimerie isolés.
Une dernière famille de traitements globaux doit être mentionnée. Nous avons vu l'effet sélectif,
obtenu en agissant sur Ff , sur les variations de la valeur de f. L'élimination d'un bruit dont les
fréquences sont prévisibles y était directe. Il en va autrement d'une variation parasitaire des
coordonnées (x, y) du point d'image portant l'intensité f(x, y). Une telle déformation du support
de l'image ne peut pas être absorbée par la transformée de Fourier, qui agit de manière linéaire
et adaptative sur les valeurs de f en supposant les coordonnées exactes. Une série de
techniques ad hoc sont utilisées pour corriger des déformations dues au support ou à la
transmission optique d'une image originelle.

1.3.7 Transformée de Hough


Les segments de droite sont des primitives simples et économiques, dont l'interprétation
ultérieure est souvent naturelle. Jusqu'ici nous avons rencontré des segments dans le contexte
de l'approximation polygonale, lors du suivi de lignes (de contour, de maximum, de niveau,
etc.). Un autre cas, classique, est la détermination d'un segment de droite optimal étant donné
un ensemble de points censés se trouver sur la droite: il s'agit de la méthode des moindres
carrés. Dans une image, il n'est cependant pas toujours facile de déterminer les pixels qui
appartiennent en fait au même segment de droite. La transformée de Hough permet, par une
méthode statistique, de délimiter les points approximativement colinéaires.
Considérons pour cela le plan de l'image idéale et son dual (figure 1.12). Une droite d
d'équation y = ax + b dans le plan de l'image a pour correspondant le point (a, b) dans le plan
dual; a est la pente et b l'ordonnée à l'origine de la droite d. Réciproquement, le point (xo, yo)
dans l'image correspond à la droite b = -xoa + yo , de pente -xo et d'ordonnée à l'origine yo
dans le plan dual. C'est cette dernière propriété qui est exploitée.
Pour chaque pixel représentant un point dans l'image discrète on reporte, dans le plan dual la
droite correspondante, également discrétisée: si une cellule (a, b) est touchée plusieurs fois on
compte le nombre de droites auxquelles elle appartient. Les fréquences ainsi cumulées
représentent un histogramme bidimensionnel, dont on extraira les modes (maxima locaux). A
chaque mode dans le plan dual discrétisé correspond une droite, contenant une concentration
de points, dans l'image.
L'avantage de la méthode de Hough est de prendre en considération l'image globale. Ses
inconvénients sont un manque de précision, qui en limite l'emploi à une première
36 1. Prétraitement en transformation d’images

y b

d : y = ax + b

b = -x0 a + y0

a
(x 0, y 0 )

Figure 1.12 . Le plan de l'image et son dual

Figure 1.13 Illustration de la recherche des arêtes d'un cube

approximation, ainsi qu'un coût important en calcul. La présentation qui a été donnée de la
transformation de Hough souffre encore d'un handicap; elle défavorise les droites verticales,
pour lesquelles il n'y a pas d'équation de la forme y = ax+b et par conséquent pas de point dans
le plan dual. On peut tenir compte de ces cas, qui sont loin d'être exceptionnels dans les
images usuelles, par une statistique complémentaire à celle du plan dual, concernant les
droites d'équation x = c. La solution habituelle du plan de l'image sous la forme normale:

x cos ϕ + y sin ϕ = d

et à reporter ϕ et d comme coordonnées du plan dual, avec les restrictions d ≥ 0, 0 ≤ ϕ ≤ 2π .


Bien entendu, le dual d'un point n'est plus une droite, mais un arc de sinusoïde.
1. Prétraitement et transformation d’images 37

On préfère souvent des méthodes locales, séquentielles. Par analogie avec le suivi de contour
et avec l'approximation polygonale, ces méthodes de suivi de segments de droite consistent à:
1) choisir un premier point (par exemple un pixel proche du maximum local d'intensité) et
une direction de départ (par exemple une tangente ou un gradient extremum)
2) passer au pixel voisin en conservant approximativement la même pente (en général on
effectue le suivi dans une seule direction; en fait les deux sens de parcours sont égale-
ment justifiés)
3) terminer sur un critère de qualité, caractérisant la propriété commune aux points du seg-
ment avec une tolérance (par exemple colinéarité, valeur de gradient -ou du pixel-
proche d'un maximum, etc.).
Le résultat escompté est une liste d'éléments géométriques primitifs segments de droite et,
plus généralement, arcs de courbe ou régions uniformes constituant une image. Chaque
élément primitif sera caractérisé par les coordonnées de ses extrémités ainsi qu'une série
d'attributs intrinsèques (couleur moyenne, pente, taille) et éventuellement de relations avec
d'autres primitives (voisins directs, angles, distances). Une image ainsi segmentée est plus
adaptée à une analyse structurelle de son contenu que ne l'était un tableau de pixels.

1.4 Extraction de primitives géométriques


L'interprétation d'une image passe par la reconnaissance et la localisation d'éléments primitifs:
régions, contours, segments de droite. Dans chaque cas nous illustrerons un algorithme
possible, mais en général pas optimal, et nous signalerons les difficultés inhérentes au
problème.

1.4.1 Extraction de domaines segmentation en régions


Un domaine est un sous-ensemble des pixels de la grille. en général ces pixels ont une
propriété commune (par exemple la même valeur de niveau de gris) et une relation de
connexité dans le plan de l'image; a priori on ne supposera pas de telles contraintes.
Une manière naturelle, mais peu pratique, de représenter un domaine est de “peindre” tous ses
pixels à l'aide d'une valeur originale, distincte des pixels du complément. Nous verrons d'autres
techniques de représentation de domaines, notamment au moyen de listes et d'arbres.
La segmentation d'une image est le partitionnement de l'ensemble de tous ses pixels en
domaines disjoints (aussi appelés régions) selon un double critère d'uniformité et de contiguïté
des pixels formant une région. Voici un algorithme de segmentation fondé sur l'agrégation
selon MST; le graphe considéré est le graphe d'adjacence des régions. Initialement chaque
région est formée d'un pixel; la distance δ(P, Q) est définie, pour des voisins immédiats (Q est
un voisin pair de P, selon la figure 1.4), comme la différence des niveaux de gris aux points P
et Q. Les autres paires de pixels ne font pas partie du graphe d'adjacence, au départ.
Le regroupement hiérarchique a lieu ensuite selon la distance croissante au plus proche voisin.
Un seuil θ est donné pour limiter l'agrégation de régions adjacentes dont les pixels respectifs,
situés de part et d'autre de la frontière, présentent une différence de niveau d'ordre θ.
Une généralisation de cette technique consiste à fusionner des régions adjacentes R et S, non
pas selon le critère ponctuel des plus proches voisins dans R et S respectivement, mais selon
le critère d(R, S) < θ où d est une mesure de dissemblance appropriée. Par exemple d(R, S)
mesure la différence des niveaux moyens de gris sur R et S respectivement. Souvent on inclut
dans la définition de d(R, S) une pondération par la taille respective de R et S (en nombre de
pixels), par la longueur de la frontière commune entre R et S, ou par des caractéristiques
38 1. Prétraitement en transformation d’images

numériques des domaines R et S telles que centre de gravité, variance des niveaux de gris,
périodicité des textures, etc.
Le graphe obtenu a pour sommets les régions et pour arêtes la relation d'adjacence. Il est
souvent muni d'informations supplémentaires: les caractéristiques des régions sont placées
aux sommets correspondants, ce qui différencie les régions adjacentes est placé aux arêtes
(figure 1.14).
1

5 6 2 5 6
2
4
4
3
3
Figure 1.14 Image segmentée en régions et graphe d'adjacence, muni des
informations de taille (par région) et de frontière (par paire de régions
adjacentes).

Cet algorithme utilise beaucoup de mémoire dans la phase initiale. Il peut être optimisé en
partant d'un graphe initial où des pixels semblables ont déjà été agglomérés (par un traitement
local ad hoc). Une technique intéressante dans ce contexte est la représentation de l'image par
un arbre quaternaire appelé quadtree, analogue à l'arbre binaire utilisé pour chaîner les suites
linéaires. Chaque noeud d'un quadtree représente soit une découpe de l'image en quadrants
(d'où les quatre pointeurs), soit une région carrée uniforme (dont le niveau de gris des pixels
est approximativement constant).

1.4.2 Le parcours d'un domaine connexe


Souvent l'image donnée se présente sous la forme d'une région et de son complément, par
exemple un objet foncé sur fond clair. Ces régions sont connexes et plus ou moins uniformes.
Pour identifier un objet particulier dans l'image, on aimerait isoler une région connexe de la
couleur adéquate, sans forcément segmenter le reste de l'image.
L'idée est de parcourir le domaine uniforme D en énumérant tous ses pixels, de proche en
proche. On fera l'hypothèse que le pixel de départ est donné, à l'intérieur du domaine D, aux
coordonnées (io, jo) et que P(x, y) est la propriété d'appartenance du pixel (i,j) au domaine D.
En outre D est supposé connexe, selon la définition suivante.
Définissons d'abord un chemin, dans une image discrétisée sur une grille rectangulaire. Un
chemin est une suite de pixels A0, A1, ..., An telle que Ai et Ai+1 sont voisins immédiats (figure
1.4) pour tout i<n. Lorsque A0 = An on dit que le chemin est fermé. Un chemin est pair si Ai+1
est un voisin pair de Ai pour tout i<n. Un domaine D est connexe si, quels que soient deux
pixels de D, il existe un chemin pair, entièrement contenu dans D, qui les relie.
L'algorithme de parcours proposé est apparenté à l'exploration arborescente du labyrinthe par
Thésée. L'équivalent du fil d'Ariane est ici une trace (c'est-à-dire une couleur particulière)
laissée sur les pixels parcourus; mais à la différence du labyrinthe, le domaine à énumérer dans
1. Prétraitement et transformation d’images 39

l'image n'a pas d'issue et l'algorithme épuise toutes les possibilités. Le critère d'appartenance
au domaine est ici la couleur (blanc).
program labyrinthe (input, output);
const hauteur = 10; largeur = 40;
var
lab array [1..hauteur, 1..largeur] of char;
hau {hauteur),
lar: integer {largeur effective du labyrinthe};
io,jo: integer {entrée du labyrinthe};
procedure lire_lab;
procedure imprime_lab;
procedure thesee (i,j: integer)
{imprime tous les chemins menant à la sortie};
begin
if lab[i,j]= ‘S’ then imprime_lab
else
if lab[i,j]= ‘‘ then
begin
lab[i,j]:= ‘.‘;
{marque le chemin pour l’impression)
thesee (i,j+1) {on essaie à droite}
thesee (i,j-1) {on essaie à gauche}
thesee (i+1,j) {on essaie en bas}
thesee (i-1,j) {on essaie en haut}
lab[i,j]:= ‘’ {on efface le chemin}
end
end
end {thesee};
begin {labyrinthe}
lire_lab; imprime_lab;
thesee (io,jo)
end (labyrinthe)

Figure 1.15 Algorithme du labyrinthe.

Pour forcer un parcours complet d’une région connexe, il suffit de supprimer les ‘S’’. Tel quel
l'algorithme proposé est gourmand en temps et en mémoire: il empile en effet les coordonnées
de tous les pixels du chemin parcouru entre deux “backtracks”; au pire ce sont tous les pixels
du domaine! Diverses optimisations ont été discutées dans la littérature [Pavlidis], [Hersch],
notamment pour favoriser le balayage du domaine par lignes horizontales; la difficulté de ces
algorithmes est de traiter correctement les domaines non convexes et ceux qui présentent des
trous (figure 1.16).

Exercie

Proposer un algorithme de remplissage des régions avec accès ligne par ligne, de haut en bas
aux pixels de grille (idée: gérer une liste de points de transition)

Figure 1.16 . Deux domaines à difficultés concavités,


trous, isthmes.
40 1. Prétraitement en transformation d’images

1.4.3 La représentation d'un domaine par son squelette


Considérons d'abord un domaine idéal, continu et à bord régulier, représenté par une courbe
fermée C continûment dérivable. On s'intéresse aux cercles tangents à C en deux endroits au
moins: les cercles bi-tangents; l'ensemble de ces cercles forme une famille dont C est
l'enveloppe. On appelle squelette du domaine bordé par C le lieu des centres des cercles bi-
tangents.
Le squelette a des propriétés mathématiques intéressantes pour décrire des formes
biologiques [Blum]; en particulier il se déforme régulièrement sous l'effet d'une incurvation du
domaine ou d'une croissance uniforme de ce dernier. Il peut toutefois avoir des points
d'embranchement; en général c'est un arbre dont les arcs sont des courbes continues. Pour
décrire entièrement la famille paramétrée des cercles bi-tangents (et donc retrouver le bord du
domaine) on ajoute, sur les arcs, la valeur du rayon du cercle bi-tangent à l'endroit de son
centre.

Figure 1.17 Le bord et le squelette d'un domaine.

En pratique, ces valeurs peuvent être approchées par une interpolation: le squelette sera
simplifié en prenant comme arcs des segments rectilignes et en munissant les noeuds de la
valeur du rayon du cercle bi-tangent (qui est alors, soit un cercle osculateur centré à une
extrémité du squelette, soit un cercle tangent en plusieurs points du bord).
Le calcul du squelette à partir du domaine peut être inspiré des feux de prairie dont le front se
propage à vitesse constante; cette image typique de la littérature américaine peut se traduire
par une autre: une onde dont l'origine est uniformément le bord du domaine se dirige vers
l'intérieur. Le squelette est le lieu des collisions de deux fronts d'onde. Le temps t où deux fronts
d'onde se rencontrent au point P est égal au rayon du cercle bi-tangent, centré en P (on
suppose la vitesse de propagation égale à l'unité).
L'algorithme qui découle de ce modèle consiste à reconnaître les points du bord et à les
éliminer, sauf s'ils appartiennent au squelette. L'opération est itérée, par couches successives;
le nombre d'itérations est donné par le rayon t maximal. L'opération est appelée l'érosion du
domaine et constitue un opérateur classique sur les images à deux niveaux; son inverse, la
dilatation, consiste à ajouter au domaine les pixels voisins du bord. L'alternance des deux
traitements a pour effet une régularisation du domaine, notamment la suppression des isthmes.

Exercice

Montrer que le squelette idéal d'un domaine polygonal est formé d'arcs de parabole et de
segments de droite.
1. Prétraitement et transformation d’images 41

1.4.4 Représentation d'une région par son contour


La représentation d'un domaine par une propriété caractéristique de ses pixels (par exemple
leur couleur) est peu économique; on préfère, pour un domaine régulier, donner une
description de ses frontières avec le complément.
Nous avons déjà vu la notion, appropriée pour les domaines connexes, de contour. Idéalement
le contour est une courbe fermée; or, en géométrie discrète, une courbe est une notion mal
définie: pour l'instant le contour C d'un domaine donné D est une région contenue dans D et
relativement mince. Ce que l'on voudrait, c'est un chemin fermé parcourant les pixels de C.
Mieux encore, pour les tronçons rectilignes (approximativement du moins) un segment de
droite reliant les points anguleux ferait parfaitement l'affaire: le domaine D serait représenté par
un polygone P. Pour retrouver les pixels formant D, il suffit de parcourir l'intérieur de P.
Plusieurs algorithmes classiques peuvent être mis en oeuvre pour obtenir l'approximation
polygonale P du domaine donné D.
Voici schématiquement un premier procédé:
• un traitement de gradient (en valeur absolue), suivi de seuillage, fait ressortir le domaine
frontière C
• une érosion amincit au besoin C
• l'algorithme du labyrinthe peut être adapté au suivi d'une région mince: le fil d'Ariane
constitue un chemin parcourant C (on arrête le parcours lorsqu'on rencontre à nouveau
le point de départ)
• on relie les centres de gravité des pixels consécutifs par des segments de droite (de

longueur 1 ou 2 )et de pente multiple de 45o). On obtient ainsi un polygone.

Note
Un procédé analogue est utilisé pour passer du squelette d'un domaine D sous forme de pixels
à une représentation du squelette comme un arbre. Tel quel, l’algorithme esquissé fait
l’hypothèse d’un domaine très mince et sans embranchements. Dès qu’il y a des bifurcations
ou des croisements, il faut adapter l’algorithme de suivi à ces situations, par exemple en
mémorisant des points de reprise.
Voici une variante du suivi de contour:
• Un traitement du gradient directionnel (masques de Freeman) permet de détecter et
d'orienter les lignes de contraste caractéristiques de la frontière de D.
• Un suivi de contour procède séquentiellement en examinant, dans le voisinage immédiat
du pixel courant, les pixels proches de la pente indiquée par le code de Freeman et de
contraste suffisant. Le pixel de départ et la direction initiale doivent être détectés par un
autre procédé, par exemple un balayage horizontal, arrêté sur un pixel à code de
Freeman égal à 0, 1 ou 7 (proche de l'horizontale) et à contraste suffisant.
• On obtient un chemin qui suit le contour. Si la qualité du contraste est suffisante, le
chemin est fermé. Sinon le domaine n'est pas correctement délimité; c'est une difficulté
intrinsèque aux algorithmes de suivi de contour.
Pour des images binaires, on peut se passer de la direction indiquée par les gradients de
Freeman et examiner directement les pixels voisins du pixel courant (à l'exclusion de ceux
examinés lors du pixel précédent). Une variante de l'algorithme du labyrinthe permet ainsi de
suivre directement le contour du domaine. Lorsque la même direction est maintenue sur
plusieurs pixels consécutifs on les remplace par un segment de droite.
42 1. Prétraitement en transformation d’images

1.4.5 L'approximation polygonale d'un contour


Les polygones obtenus par les procédés de suivi de contour évoqués ci-dessus ont des
segments dont la pente ne prend q'une des 8 directions de Freeman et dont la longueur est en
général très petite: de l'ordre d'un ou quelques pixels. On préfère souvent une approximation
polygonale avec des côtés, moins nombreux, plus longs et de pente optimale afin de s'écarter
le moins possible des pixels du contour donné. Deux techniques sont connues à cet effet.
La première est la dichotomie. On suppose, pour simplifier, que la ligne donnée L a deux
extrémités distinctes A et B. La corde par A et B est un candidat pour être un segment de la
ligne polygonale approchant L. Si la distance maximale entre la corde et les pixels de L est
inférieure à une tolérance Max, on a terminé; sinon on prend le pixel C de distance maximale
à la corde et on recourt à la même technique pour les tronçons AC et CB séparément (figure
1.18). On peut aussi terminer lorsque les tronçons ont moins de Min pixels. Les paramètres
Max ou Min ont une grande influence sur le nombre de côtés obtenus; la solution n'est d'ailleurs
pas unique.

C > Max

L
B

Figure 1.18 L'approximation polygonale d'une ligne L par dichotomie.

La seconde est séquentielle. Partant d'une extrémité, disons A (lorsque la ligne est fermée on
part d'un point quelconque), on commence par examiner Min points consécutifs. On détermine
la pente optimale d'un segment de droite approximant ces points (on peut imposer que le
segment passe par A). Si ce segment est à une distance inférieure à Max des Min points
choisis, on le prolonge par les pixels consécutifs tant que la distance reste bornée par Max. Le
dernier point adjoint est utilisé comme point de départ pour le prochain segment du polygone.
L'algorithme doit être complété par un traitement pragmatique du cas où le segment de Min
points ne satisfait pas la contrainte du Max pour les distances aux pixels. En général, il donne
un résultat biaisé par l'asymétrie entre les points initial et final de chaque segment, qui a
tendance à “aller trop loin”, dans le sens du parcours [Devars86]. Ici également on veut
minimiser le nombre de segments.

Exercices

1) Proposer un algorithme d'énumération du contour C d'un domaine D par un chemin fer-


mé sur une grille noir-blanc. On suppose que le domaine D est simplement connexe et
que le point initial A du contour est donné.
2) Supposer le contour d'une région donné sous la forme d'un code en chaîne de Freeman
(le point de départ et la direction initiale sont placés à l'origine). Obtenir une approxima-
tion polygonale du même contour, chaque côté du polygone ayant si possible une
longueur minimale de min = 5 pels et un écart maximal de max = 1.5 des pels du bord
donné.
3) Coder la coloration d'un domaine D, formé des pels à l'intérieur et sur les côtés d'un poly-
1. Prétraitement et transformation d’images 43

gone donné sous la forme d'une liste de segments de droite. Tenir compte des parties
convexes et des tronçons parallèles aux axes. L'algorithme se généralise-t-il au cas où
D a des trous dont le bord est également décrit par des segments de droite?

Remarque
Une adaptation de l’algorithme du labyrinthe est celui de “la main courante”; au lieu d’explorer
récursivement tous les voisins (sauf celui dont on vient) on prend le pixel voisin qui est la
frontière du domaine. Un heuristique simple permet de trouver cette frontière rapidement, sauf
peut-être aux pointes et aux isthmes du contour.
Une autre variante permet de faire le suivi de crête; on vise, à chaque pixel, le voisin près du
maximum relatif. Une heuristique commune consiste à conserver la direction courante; par
contre les bifurcations et les extrémités doivent être traitées avec soin.

Figure 1.19 Caractère chinois avec suivi de contour et polygone approximant


44 1. Prétraitement en transformation d’images

1.5 Exercices

 
  

 
 
    

         

         
         
         
         
         
         
         
         
         
         

  !
     " 
 # 



  
  
  
 $
  %

 


      
 
  
% 
    
 #    
    %

  &
   
 

 &  #'


(  
) * %
  &  +   &   % 

    
    
1. Prétraitement et transformation d’images 45

 
         
  


    
   
       
 
         

     
     
 
   
      

  

            

 !  " #$%  

  $ " "
 
  " 
    
   !
   "
        "  
  $  !
 &  & 

'
  #$% () #$%*'++ +!
, "       - 
  &      " 
"   "     ! .     


 /0 
     &  

    
1 2   
  /3
4 .  & 5/    0
5
6 2         
 
7 2      
8     
9 2         
8 
   ! 

! 8  
: ;& !  
< .           

= >      !?
@ /  8!       
1A   
       !  
11 3   "  2  & &
14 .    
16  8      !
17 B     !" CD14 ED14
19      
  '
1:        E    !"  

    
1< /   &!    


    

1 %  8    
    !&     >  3 
 >3
4 , 0 '
F 2  & 

F 2    "
F >   
F G     !
  "
46 1. Prétraitement en transformation d’images

   




  
  

   

             

  

                  
 
               
       !   " 
  

  # $               
% & &'' 

 

    
 




  
 
 
 
$ (      &  


  
      
) *%       + +  + +
"   ,-- (- - -#
. &    
   
 
 
         /   "   
0   #
1 
2    "   
 #   
"    
 #  !   
 
3          0  
    
     
4 5 &       %    *   6 /
  
  !     +  .+       
/  



 
7 8       9 :       5 
 " ,-- (- - -# 0 2  !   
8  


    


2       /         8 
8   
1. Prétraitement et transformation d’images 47

  
 
   


 
    
   

 
 
       
   = xcosθ+ysinθ
   
 
    
  θ 
 



     xi ,yi 


  = xcosθ+ysinθ  
 

 !   "
  = xi cosθ + yi sinθ
  
 (,θ) #  

  (,θ)

 $ % 
 
&  
    
 
' 
   
 (
  

 
 
   
   
$ &  
   
   
 ' 
 

 
   

  


 
  )

  
 
 $
 #  
 '  
 
   
 *
+ ,  
        
   
    
  

      


   
 -   .     -        /
 


    0     '     

 1

 
% #   
    P0   


 )

 
 $
% &
   d0 2
  )
 (d0 = 0)

 
 

   
 Pi
  
 3     



 # 424  Pi = v(Pi−1 ,di ) 5 di  
  
48 1. Prétraitement en transformation d’images

    
   
P0

Pi
Pi+1

     
   

Pi−1
di
d i+1
Pi Pi+1

     
   
1. Prétraitement et transformation d’images 49

  
             
     
    di    di−1     
di ←− (di−1 + 4) !   
" 
di ←− di − 1 #  
   
  $
Pi ←− v(Pi−1 ,di )
% &  Pi    Pi = Pi−1

 
!  ' &       P0 


(   
 di   )  
  $
50 1. Prétraitement en transformation d’images

1.6 Annexe: Script Fu et plug-in Grimp


Script-Fu
macro language
connects to GIMP database
based on Scheme

Scheme
Lisp-like language
interpreted

Script installation
install (put) script in ~/.gimp/scripts
refresh GIMP

Script types
Stand-alone --- can always be used (button creation, etc.)
Image dependent -- dependent on image type (modifications)

Gimp Scripts in Scheme

Scheme
a variant on LISP.
processes LISTS
each list is a function with it's arguments
evaluate functions to return values

(+ 3 4) => 7
(* 7 6) => 42
(+
(* 3 4)
(/ 1 3)) => 4
(define (borne x)
(cond ((< x 0) 0)
((> x 255) 255)
(T x)))
(borne 278) => 255
(borne -12) => 0
(borne 236) => 236

Literals
Quoted values:
'this
'(255 127 63)
(* '5 '5)
(borne '235)

Variables
(set! orange '(255 277 0))
(gimp-set-background-color orange)
(gimp-set-background-color 'orange)
(gimp-set-background-color '(255 127 0))

Local variables(*)
(let* ((a 3)
(b 4)
(
(/ a b)
)
)
)
)
1. Prétraitement et transformation d’images 51

List Processing
Lists are made up of
a first element (head) -- possibly a list
the rest of the list (tail) -- always a list
(1 2 3) = (1 (2 (3 ())))
()
The empty list () is a list!
(car '(1 2 3)) => 1
(car '((a b) 2 3)) = > (a b)
(cdr '(1 2 3)) => (2 3)

More list processing


(cdr (cdr '(1 2 3 4))) => (3 4)
(cddr '(1 2 3 4)) => (3 4)
(car (cdr (cdr '(1 2 3 4)))) => 3
(caddr '(1 2 3 4)) => 3
(cadr (quote (1 2 3 4))) => 2
Note: all GIMP functions return lists

Loops
The only looping construct that exists in Script-Fu is while
Note: this constraint is due to the current scheme interpreter SIOD used for Script-Fu. Once
the scheme interpreter as planned is changed to Guile, more looping constructs will
probably be added.] The while loop looks as follows:
(while (condition)
(statement1)
(statement2)
:
)

GIMP Procedural DataBase (PDB)


Correspondence between script functions and GIMP interface.

Registering functions with Script-Fu


Places script in interface menu
registers parameter types and default values
places command in PDB
(script-fu-register
"my-func" ; name of func
"/<Toolbox>/Xtns/Script-Fu/My/Func" ; menu posn.
"Does something" ; help string
"I. Am" ; author
"It's mine" ; copyright
"Today" ; date
"" ;accepts any image type
SF-VALUE "a" "0" ; value param
SF-COLOR "bk" '(0 0 0) ; color param
SF-TOGGLE "inv" 0 ; boolean

Defining Script-Fu functions


(define (my-func a bk inv)
; create image and layer
(set! img
(car (gimp-image-new a a RGB)))
(set! layer
(car (gimp-layer-new img a a
RGB "layer 1" 100 NORMAL)))
(gimp-image-disable-undo img)
(gimp-image-add-layer img layer 0)
(cond ((equalp inv 0)
(gimp-palette-set-background bk))
52 1. Prétraitement en transformation d’images

(T
(gimp-palette-set-background
(invert bk))))
(gimp-edit-fill img layer)
(gimp-display-new img)
(gimp-image-enable-undo img))

Working on current image


(script-fu-register "doit"
"<Image>/Script-Fu/Me/doit"
"Do something"
"Me" "Mime" "today"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0
SF-VALUE "with" 5)
(define (doit img layer with)...)

Exemple 1
The following script uni.scm receives two parameters from the user, the size of the image, and
a color and goes on to produce a uniform image of the requested size and the requested color.
Not very useful, but it shows the essential steps in producing a script-fu script. (";" is a mark that
the following is a comment):
; Define the function of the script and ;list its parameters
; The parameters will be matched with the ;parameters listed
; below in script-fu-register.
(define (uni-img size color)
; Create an img and a layer
(set! img (car (gimp-image-new size size RGB)))
(set! layer (car (gimp-layer-new img size size RGB "layer 1" 100 NORMAL)))
; The following is done for all scripts
(gimp-image-disable-undo img)
(gimp-image-add-layer img layer 0)
; Here is where the painting starts. We ;now have an image
; and layer and may paint in the layer ;through the PDB functions
(gimp-palette-set-background color)
(gimp-edit-fill img layer)
; The following is also done for all ;script
(gimp-display-new img)
(gimp-image-enable-undo img))
; Finally register our script with ;script-fu.
(script-fu-register "uni-img"
"<Toolbox>/Xtns/Script-Fu/Tutorials/Uniform image"
"Creates a uniform image"
"Dov Grobgeld"
"Dov Grobgeld"
"1997"
""
SF-VALUE "size" "100"
SF-COLOR "color" '(255 127 0))

Exemple 2
Here is an example script which copies the current layer to a new layer, blurs it and inverts it:
(define (script-fu-copy-blur img drawable blur-radius)
; Create a new layer
(set! new-layer (car (gimp-layer-copy drawable 0)))
; Give it a name
(gimp-layer-set-name new-layer "Gauss-blurred")
; Add the new layer to the image
(gimp-image-add-layer img new-layer 0)
; Call a plugin to blur the image
(plug-in-gauss-rle 1 img new-layer blur-radius 1 1)
; Invert the new layer
1. Prétraitement et transformation d’images 53

(gimp-invert img new-layer)


; Flush the display
(gimp-displays-flush)
)
(script-fu-register "script-fu-copy-blur"
"<Image>/Script-Fu/Tutorial/copy-blur"
"Copy and blur a layer"
"Dov Grobgeld"
"Dov Grobgeld"
"1998"

"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer to blur" 0
SF-VALUE "Blur strength" "5")

Exemple 3
Here's an example which draws horizontal lines, 16 pixels high, on an image:
(set! y 0)(while (< y size)
(gimp-rect-select img 0 y size 16 REPLACE 0 0)
(gimp-edit-fill img layer-one)
(set! y (+ y 32)))

Exemple 4
Hereis an exemple to write a text in an image:
(define (script-fu-hello-world img drawable)
; Start an undo group. Everything between the start and the end
; will be carried out if an undo command is issued.
(gimp-undo-push-group-start img)
; Create the text. See DBbrowser for parameters of gimp-text.
(set! text-float (car (gimp-text
img
drawable
10 10
"Hello world"
0
1
30
1
"*" "Helvetica" "medium" "r" "*" "*")))
; Anchor the selection
(gimp-floating-sel-anchor text-float)
; Complete the undo group
(gimp-undo-push-group-end img)
; Flush output
(gimp-displays-flush))
(script-fu-register "script-fu-hello-world"
"<Image>/Script-Fu/Tutorial/Hello World"
"Write Hello World in the current image"
"Dov Grobgeld"
"Dov Grobgeld"
"1998"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0)

Exemple5: Copying a selection


To copy a selection, the command gimp-edit-copy is used. It places a copy of the selection
contents in the cut-buffer. The contents of the cut-buffer may then be pasted into a layer, the
same layer or another one, and it is then pasted as a floating layer.
54 1. Prétraitement en transformation d’images

In the following example the selection is copied, pasted into the same layer, offset a fixed
distance, finally anchored. Try it by drawing a small blob in the middle of the image, select the
blob, and then call this script.
(define (script-fu-sel-copy img drawable)
(gimp-undo-push-group-start img)
(gimp-edit-copy img drawable)
(set! sel-float (car (gimp-edit-paste img drawable FALSE)))
(gimp-layer-set-offsets sel-float 100 50)
; Anchor the selection
(gimp-floating-sel-anchor sel-float)
; Complete the undo group
(gimp-undo-push-group-end img)
; Flush output
(gimp-displays-flush))
(script-fu-register "script-fu-sel-copy"
"<Image>/Script-Fu/Tutorial/Selection Copy"
"Copy the selection into the same layer"
"Dov Grobgeld"
"Dov Grobgeld"
"1998"
"RGB*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Layer" 0)

Plug-ins in Gimp
A plug-in is a program that can't run on its own, it needs to be started by Gimp.

Compile?
Most of the time, plug-ins are distributed in the source code. All programs have a source code
(if they aren't written directly in machine code). The source code is written in a language
humans can understand, like C, C++ etc...
The computer doesn't understand C or C++, so the code needs to be translated to machine
code which the computer understands and can execute. This translation is called compiling.

Finding out how to compile the plug-in


Using GCC to compile the plug-in straight off
If the file is named plugin.c, then compile it with gcc -o plug-in plugin.c. The -o flag tells the
compiler that the final output (the plug-in) should be named plug-in.
1. Prétraitement et transformation d’images 55

If Using GCC to compile the plug-in straight off


The C-compiler (GCC) is configured to search the standard directories for the include and
library files, and those files are indeed in the standard directories, then the plug-in will compile
cleanly. But most of the time this is not the case since you probably will need specific Gimp
libraries and include files.

Using gimptool
gimptool --install plug-in.c
gcc -c `gimptool --cflags` plug-in.c
The cflag stands for the C library.

Exercises
1. Look at the structure of the plug-ins "erosion" and "dilatation".
2. Compile them using gimptool --install plug-in.c.
3. Apply these plug-ins on some images.

Anda mungkin juga menyukai