Le nom RACEME n'est pas anglais et ne signifie en aucun cas "Race Me". Ce nom provient d'un terme chimique. Un indice: cherchez ce que sont des énantiomères ou des molécules chirales...  Home   Zaurus   Debian   RioUtil   Projets Imac   Atari   mp3 
 TNS: Binarisation  Rééchantillonnage  Java: Applets  Ftp  Divers: Calculatrice  Killer  Disk Usage





Binarisation d'images par diffusion d'erreur

Traitement Numérique du Signal

Christophe Boyanique
Emmanuel Pinard
Mars 1999






Introduction

L'utilisation courante d'applications utilisant des images nécessite la possibilité de pouvoir modifier le codage couleur des images: par exemple requantifier une image couleur en noir et blanc afin de l'imprimer sur une imprimante monochrome.

L'utilisation de différents algorithmes plus ou moins évolués permet de minimiser la perte d'information lors de la réduction du nombre de couleurs d'une image.

Principe de la requantification

La requantification d'une image consiste à modifier le nombre de bits de codage d'une couleur (c'est à dire le nombre de valeurs possibles d'un pixel ou d'une composante de pixel). Dans la majeure partie des cas, une diminution du nombre de bits de codage de l'image entrainera une perte d'information plus ou moins importante selon l'algorithme utilisé.

la binarisation

La binarisition est l'algorithme le plus simple de requantification. Chaque pixel de l'image est transformé en un pixel noir ou blanc suivant sa valeur de départ.

Ainsi si la valeur d'un pixel est supérieure à 127 on lui associera la nouvelle valeur 255 (blanc), dans le cas contraire on lui associera 0 (noir). Cette technique est aussi appelée technique du seuil.

la requantification

Dans le cas général de la requantification, on divise la plage de valeurs de chaque pixel (de 0 à 255) en un nombre fini de plage (fixé par le nombre de bits de codage).Chaque pixel est ensuite classé dans une des plages suivant sa valeur en utilisant la même technique.

Dans le cas d'image comportant plusieurs composantes (rouge, vert et bleu), on traite chaque composante indépendamment des autres.

diffusion d'erreur: algorithme de Floyd-Steinberg

Dans les algorithmes précédents la perte d'information est très importante en général. Il est donc naturel de chercher un algorithme permettant de compenser la perte d'information lorsque l'on quantifie la valeur d'un pixel.

L'algorithme le plus courant utilise la diffusion d'erreur: lors de la quantification d'un pixel, on répartit sur les pixels voisins non traités l'erreur algébrique introduite (nouvelle valeur du pixel - ancienne valeur du pixel).

L'algorithme de Floyd-Steinberg (1975) répartit l'erreur sur les quatres pixels les plus proches suivant une matrice:

x7/16
3/165/161/16

autres types de diffusion d'erreur

Il existe plein d'autres algorithmes basés sur la diffusion d'erreurs. Il suffit en effet de changer la matrice de répartition des erreurs pour obtenir un résultat différent.

On trouve entre autre les algorithmes suivants:

Algorithme de Stucki:

x8/424/42
2/424/428/424/422/42
1/422/424/422/421/42

Algorithme de Burkes:
x8/324/32
2/324/328/324/322/32

Algorithme de Sierra:
x5/323/32
2/324/325/324/322/32
2/323/322/32

Programmation

Les différents algorithmes de requantification ont été programmés en langage C ANSI. Ces programmes ne font que les conversions, il faudra donc utiliser un utilitaire externe pour visualiser les images. Les sources de ces programmes sont largement commentés.

Tous les programmes utilisent des fichiers au format PGM ASCII (PBM en 1bit, PGM en 256 niveaux de gris et PPM en 8 ou 24 bits).

Conversion ppm 24bits en 8bits

Fichier source

Ce programme convertit un fichier 24 bits (donc 8 bits par composante) en un ficher 8 bits (3bits pour les composantes rouge et vert, 2 bits pour la composante bleu) et calcule le rapport signal/bruit.

La diffusion d'erreur est implémentée en utilisant un buffer de deux lignes sur lesquelles on répartit l'erreur de la ligne courante et de la ligne suivante.

Pour utiliser la binarisation brute:
./ppm24to8 -b input.ppm output.ppm

Pour utiliser la diffusion d'erreur:
./ppm24to8 -f input.ppm output.ppm

Le programme peut être appelé avec -F et -B au lieu de -f et -b pour créer des images sans header utilisables directement sans Scilab.

Conversion pgm 8bits en pbm 1bit

Fichier source

Ce programme convertit un fichier 256 niveaux de gris (PGM) en un fichier monochrome (PBM) et calcule le rapport signal/bruit.

La diffusion d'erreur est implémentée en utilisant un buffer de deux lignes sur lesquelles on répartit l'erreur de la ligne courante et de la ligne suivante.

Pour utiliser la binarisation brute:
./pgm2pbm -b input.pgm output.pbm

Pour utiliser la diffusion d'erreur:
./pgm2pbm -f input.pgm output.pbm

Le programme peut être appelé avec -F et -B au lieu de -f et -b pour créer des images sans header utilisables directement sans Scilab.

Calcul du rapport signal/bruit pgm/pbm

Fichier source

Ce programme permet de calculer le rapport signal/bruit de deux images: fichier PGM (256 niveaux de gris) et fichier PBM (monochrome) en entrée:
./sb input.pgm output.pbm

Application à différents types d'images:

Résultats d'exécution des programmes

On constate que le rapport signal/bruit suggère la qualité d'un algorithme: celui-ci est d'autant plus bas que l'image est meilleure.

L'algorithme de binarisation brute a tendance à faire disparaitre des morceaux d'images. L'algorithme de diffusion d'erreur donne une image plus complète mais fait apparaitre des motifs non présents dans l'image initiale.

dégradé

Exemples 1 2 3

L'image du dégradé 1 montre bien la perte d'information et les seuils lors de la binarisation brute. L'algorithme de diffusion d'erreur laisse apparaitre un léger phénomène de serpentins.

L'image du dégradé 2 montre encore mieux la perte d'information lors de la binarisation brute en monochrome. On constate aussi sur l'image issue de la diffusion d'erreur en monochrome l'apparition de points non présents sur l'image initiale dûs à la diffusion de l'erreur des points clairs sur les points sombres.

L'image du dégradé 3 laisse bien apparaitre le phénomène des serpentins.

photographie

Exemple 1

On constate que l'effet des serpentins est peu visible sur une image de type photographie. Par contre, on ressent bien sur l'image issue de la diffusion d'erreur en couleur le déséquilibre entre les compostantes rouge/vert et bleu: les paliers étant différents il apparait des points tendant vers le bleu.

synthèse

Exemples 2D 3D

L'image de synthèse 1 permet de visualiser le phénomène des points bleux sur l'image issue de la diffusion d'erreur. Elle met bien en évidence aussi la différence de résultat entre les deux algorithmes.

L'image de synthèse 2 montre très bien les limites de la binarisation brute: l'image étant très claire, l'image binarisée se retrouve presque blanche. Il est possible d'atténuer ce problème en changeant le seuil (par exemple le mettre vers 100 au lieu de 127); mais cette manipulation est suggestive.

uniforme

Exemple 1

Ce type d'image uniforme montre bien le phénomène d'apparition de points non présents dans l'image initiale lorsque l'on a des brusques changements de couleurs (de bleu à blanc par exemple). En monochrome on constate aussi l'apparition des serpentins dûe à la diffusion d'erreur.

Conclusion

L'étude de ces deux algorithmes montre bien que la manipulation d'images pose des problèmes délicats: si on utilise la binarisation, la perte d'information est trop importante dans la plupart des cas; si on utilise un algorithme de diffusion d'erreur, on risque de diffuser l'erreur d'une zone d'image sur une autre zone totalement différente (comme des points blancs sur une surface noire par exemple).

On constate en plus que la quantification en 8 bits implique des valeurs de codage différentes pour les composantes ce qui peut entrainer des phénomènes de distorsion de couleur.

L'utilisation de la diffusion d'erreur est donc délicate ce qui explique le nombre de matrices différentes: on peut restreindre l'erreur aux points immédiatement voisins (Floyd-Steinberg) ou la répartir sur un ensemble plus élevé de points (Stucki).

Dans la plupart des cas on ne peut prévoir à l'avance l'algorithme à utiliser sans une analyse de l'image.