On désigne par technique de traitement d'images toutes les techniques ayant pour but la modification des caractéristiques chromatiques des pixels des images bitmap.
Traitement d'images est souvent synonyme d'amélioration des images avec pour but l'obtention d'une plus grande lisibilité.
Il n'y a pas création d'informations, mais mise en évidence de l'information pertinente déjà présente.
L'utilisation de filtres est un exemple de traitement d'images en vue de leur amélioration.
Le filtrage manipule uniquement les données de l'image numérisée : meilleur rendu de l'image, ou atténuation du bruit conséquent à la numérisation, etc.
Quand on filtre, on ne s'intéresse pas à la valeur sémantique de l'image. Seul le signal (les pixels) est étudié : s'il est trop détérioré, le filtrage ne suffira pas.
Notons pour finir qu'il n'y a pas de filtre idéal, corrigeant tous les défauts : chaque filtre s'attaque à un défaut bien précis.
Il existe deux types de filtres :
Parmi les filtres locaux, on distingue :
Par exemple, supposons que l'on ait choisi pour noyau :
$\left( \begin{array}{ccc} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{array} \right)$
et que le block $3 \times 3$ du coin supérieur gauche de l'image (à améliorer) soit, en niveaux de gris :
$\left(\begin{array}{ccc}211 & 214 & 221 \\211 & 214 & 222 \\210 & 210 & 221 \\\end{array}\right)$
Alors le pixel $2 \times 2$ de la nouvelle image aura pour niveau de gris : $1 \times 211 + 2 \times 214 + 1 \times 221 + 2 \times 211 + ... + 1 \times 221$
On s'aperçoit que la nouvelle image aura des niveaux de gris supérieur à 255. On pourra alors rechercher le maximum $M$ de ces nouvelles valeurs, et diviser tous les niveaux de gris par $M$.
Pour les noyaux de convolutions ayant des valeurs négatives, on peut trouver des niveaux de gris négatifs. Une homothétie-translation permettra de se ramener à des niveaux entre 0 et 255.
Enfin, pour les pixels au bord de l'image, on peut (par exemple) fixer les éléments non-définis de leurs voisinages à 0.
On appelle spectre d'une image, la courbe de répartition des couleurs d'une image : niveau de gris en x, nombre de pixels en y.
Sur une image noir et blanc (à niveaux de gris), il existe un seul spectre.
Sur une image en couleurs, on peut calculer un spectre par teinte de base ou utiliser la moyenne des trois composantes pour chaque pixel.
Pour obtenir le spectre, après avoir ouvert une image :
>>> import Image >>> toto=Image.open('monImage.jpg','r') >>> toto.histogram()
Pour une visualisation graphique :
>>> from pylab import plot,show >>> plot(toto.histogram()) >>> show()
Selon le mode de l'image (niveaux de gris, RGB, etc.), le vecteur renvoyé par toto.histogram() n'aura pas la même taille.
Dans le cas d'une image RGB, ce vecteur a 256*3 = 768 éléments, correspondant à la concaténation des histogrammes en rouge, vert et bleu.
Pour n'afficher que la partie vert, par exemple :
>>> plot(toto.histogram()[255:2*255]) >>> show()
Enfin, toto.getextrema() permet de récupérer les valeurs extrémales de l'histogramme, par bande.
On peut effectuer des opérations composante par composante (sur le rouge, le vert et le bleu par exemple) sur les images :
On peut aussi effectuer des opérations bit par bit (sur les valeurs binaires des pixels) sur les images :
Effectuer un filtrage spectral consiste à modifier, selon une fonction $f$(teinte), la teinte de chaque pixel de l'image de manière à modifier son spectre.
Par exemple, pour la négation d'une image RGB, la teinte des pixels est modifiée suivant la fonction $f(x) = 255-x$ :
Réalisons un tel filtre...
>>> toto=Image.open('03.jpg','r')
... return 255-x ... >>> for k in range(toto.size[0]): ... for l in range(toto.size[1]): ... X=toto.getpixel((k,l)) ... toto.putpixel((k,l),(negat(X[0]),negat(X[1]),negat(X[2]))) ... >>>toto.show()
Passons à l'assombrissement d'une image...
La teinte des pixels est déplacée de manière à rapprocher les composantes RGB de leur minimum, pour assombrir l'image.
La fonction est du genre $f(x) = \lfloor 255 \left( \frac{x}{255} \right)^2 \rfloor$.
Cela revient à tasser le spectre vers la gauche.
Pour éclaircir une image, on procède comme précédemment, sauf que les composantes RGB de l'image sont rapprochées de leur maximum.
La fonction est du genre $f(x) = \lfloor 255 \sqrt{ \frac{x}{255}} \rfloor$.
Cela revient à tasser le spectre vers la droite.
Pour diminuer le contraste on rapproche les composantes RGB de leur moyenne.
La fonction est du genre $f(x) = \lfloor 127+127 \times \left( \frac{x-127}{127} \right)^3 \rfloor$.
Une fonction pour diminuer le contraste...
Cela revient à tasser le spectre vers le centre.
Pour augmenter le contraste, on éloigne les composantes RGB de leur moyenne (ellles sont rapprochées de leurs extrema).
La fonction est du genre $f(x) = \lfloor 127+127 \times \sqrt{ \frac{x-127}{127}} \rfloor$.
où $\sqrt{X}$ désigne ici la racine cubique.
Une fonction pour augmenter le contraste...
Cela revient à tasser le spectre vers les bords.