Redimensionner une image : le seam carving
Cours · algorithmique (école d'ingénieur), chapitre 6 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Objectifs du chapitre
- Découvrir une application spectaculaire et récente de la programmation dynamique au traitement d'images.
- Enchaîner plusieurs traitements sur des tableaux à deux dimensions : image énergies coûts minimum chemin image réduite.
- Écrire une récurrence de chemin de coût minimum dont le départ et l'arrivée sont libres.
6.1 Le problème
Une photographie de pixels doit être affichée sur un écran de téléphone, en mode portrait. Comment réduire sa largeur ?
- Mise à l'échelle : on réduit toute l'image. Les personnages et les objets sont écrasés, déformés.
- Recadrage : on coupe les bords. On perd ce qui s'y trouvait, peut-être l'essentiel.
En 2007, Shai Avidan et Ariel Shamir ont proposé une troisième voie, le seam carving (« découpe de coutures » ; S. Avidan, A. Shamir, Seam carving for content-aware image resizing, ACM Transactions on Graphics (SIGGRAPH), 26(3), 2007). L'idée : retirer de l'image, un par un, des chemins de pixels qui traversent l'image de bas en haut en passant par les zones les moins intéressantes (un ciel uniforme, une étendue de sable, un mur). Chaque chemin retiré diminue la largeur d'un pixel, et le contenu important est préservé. L'algorithme est aujourd'hui présent dans les logiciels de retouche (sous le nom de mise à l'échelle en fonction du contenu) ; on peut l'essayer dans de nombreux démonstrateurs en ligne.
Soit une image de lignes et colonnes (la ligne est en bas). Une couture verticale est une suite de pixels , un par ligne, telle que deux pixels consécutifs sont voisins : .
Autrement dit, on part d'un pixel quelconque de la ligne , et l'on monte d'une ligne à chaque pas, vers le Nord-Ouest, le Nord ou le Nord-Est. Retirer une couture, c'est retirer exactement un pixel par ligne : l'image reste rectangulaire, avec colonnes.
6.2 L'énergie d'un pixel
Qu'est-ce qu'une « zone peu intéressante » ? Une zone où les pixels ressemblent à leurs voisins. On mesure cela par l'énergie d'un pixel. Nous travaillons avec des images en niveaux de gris : chaque pixel a un niveau de gris .
Soit l'ensemble des voisins du pixel (les pixels qui le touchent, y compris en diagonale). L'énergie de est l'écart moyen entre son niveau de gris et celui de ses voisins :
Un pixel intérieur a voisins, un pixel du bord (hors coins) en a , un pixel de coin en a .
Un pixel a le niveau de gris ; quatre de ses voisins valent et les quatre autres . Son énergie est . Un pixel au milieu d'une zone uniforme a une énergie nulle ; un pixel sur un contour net (un bord d'objet) a une énergie élevée.
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.