Dithering ?? 

Certains me diront : "mais le dithering, c'est quoi ?". En français on appelle ça le tramage, et c'est une technique qui permet d'améliorer le rendu lorsque l'on dispose d'un nombre très limité de couleurs. Par exemple, pour reconstituer une image en niveaux de gris avec uniquement des pixels noirs et blanc, on va faire pour les zones grises une alternance entre les pixels blancs et noirs, pour que de loin on ait la sensation de voir du gris....

Utilisation pratique

Sur l'eBook, pour les images de bonne taille, au chargement, les images sont converties en 3bit avec un dithering, en utilisant le dithering de Sierra. Pour l'interface, on a parfois des images d'1 pixel de large qui sont répétées un peu partout pour constituer des bandeaux. Il se passe quoi si on fait le dithering, puis qu'on les affiches ? Pas de dithering ! Effectivement, on va juste répéter le motif et donc ça n'avance pas à grand chose.

Algo

Du coup à l'affichage, à la volée, on va appliquer un dithering sur les bandeaux. Toujours en utilisant la méthode de Sierra, c'est très rapide (et le rendu est plutôt pas mal). En fait la méthode est particulièrement simple : pour chaque pixel que l'on dessine, on récupère la couleur d'origine, la couleur qui va être affichée (une fois en niveaux de gris 3bits), et par soustraction le niveau d'erreur. Sierra existe en une méthode "belle" et une "rapide" (dite "lite"), mais franchement la méthode lite a déjà un très bon rendu. La répercution de l'erreur se fait selon le schéma suivant :

  * 2
1 1

* est le pixel que l'on dessine, et autour on a comment répercuter l'erreur (on a un total de 4, donc pour le pixel a droite on rajoute à la couleur 2e/4, en bas e/4, et en bas à gauche e/4). L'idée est simple et astucieuse, quand on regarde ce que ça fait : si un pixel est affiché avec une couleur plus claire que la couleur idéale (puisqu'on n'a pas tous les niveaux de gris), alors les pixels autour vont avoir une couleur un peu plus foncée, et donc la réduction de couleur sur ces pixels va avoir plus de chance de donner le niveau de gris supérieur. Quand on veut vraiment avoir de bonnes performances, la méthode est d'autant plus efficace que finalement on n'a que e/2 et e/4 comme valeurs, donc ni multiplication, ni division à faire.

La méthode "haute qualité" de Sierra se fait avec le filtre suivant :

    * 4 3
1 2 3 2 1

(total de 16, donc 1 représente e/16)

Dans cette version on voit que l'erreur se propage beaucoup plus loin, mais forcément ce sera un peu plus couteux.

Dans les 2 versions, l'intérêt de la méthode de Sierra par rapport à d'autres est que l'erreur ne se propage qu'aux pixels suivants sur la ligne et aux pixels sur la ligne d'en-dessous. On peut donc appliquer l'algo en 1 passe, à la volée, alors que d'autres algos nécessitent plusieurs passes pour des résultats similaires.

Pour conclure...

Si vous voulez plus d'infos, ou simplement voir à quoi ça ressemble en terme de résultat (je verrais peut-être pour rajouter des images ici...), je vous invite à aller voir sur wikipedia, ils présentent vite fait les différents algos (sans les expliquer par contre) avec le résultat en image.

Image d'origine
Dithering_-_Originale.png


Méthode de Sierra
Dithering_-_Sierra.png

Méthode de Floyd-Steinberg
Dithering_-_Floyd-Steinberg.png

Et pour aller encore plus loin (voir d'autres techniques, vous instruire, ...), je vous invite à aller lire le papier de Lee Daniel Crocker, qui explique comment améliorer au mieux le résultat, ainsi que les quelques pièges à éviter.

A noter que dans ces exemples on utilise uniquement 2 niveaux de gris (noir et blanc), mais que la méthode de la diffusion d'erreur présente l'avantage de marcher quel que soit le nombre de niveaux de gris.