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:
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
Pour pouvoir les présenter plus formellement, nous nous référons à un modèle de plan discret:
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
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
σ = Var ∆f
On obtient par superposition:
σ 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
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):
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
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 = 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.
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
-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
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.
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
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.
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.
∞
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.
∞
– 2 πiνt v ( t ) dt
etG(ν) = ∫e
–∞
∞
– 2 πiνt p ( t ) dt
alorsF(ν)G(ν) = ∫e
–∞
∞
avec p(t) = ∫ u(τ)v ( t – τ ) dτ
–∞
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:
∞ ∞ ∞ ∞
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.
– 2π ( νx + µy )i dx dy
F f(ν, µ) = ∫ f(x, y)e
R2
2π ( νx + µy )i dν dµ
f ( x, y ) = ∫ Ff(ν, µ)e
R2
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
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
µ
--- 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.
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
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 = –∞
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
∑
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
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
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é.
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.
y b
d : y = ax + b
b = -x0 a + y0
a
(x 0, y 0 )
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
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.
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).
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)
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)
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
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
C > Max
L
B
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
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.
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
= xcosθ+ysinθ
θ
xi ,yi
= xcosθ+ysinθ
!
"
= xi cosθ + yi sinθ
(,θ) #
(,θ)
$ %
&
'
(
$ &
'
)
$
#
'
*
+ ,
% #
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
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)
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)
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)
:
)
(T
(gimp-palette-set-background
(invert bk))))
(gimp-edit-fill img layer)
(gimp-display-new img)
(gimp-image-enable-undo img))
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
"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)
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.
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.