TP2: Découpage d'images

TP2: Découpage d'images

Réalisé par Lei Lei

Description du projet

Le but de ce travail est de redimensionner une image sans toutefois perdre son contenu. Une approche plus intéressante est déjà bien proposée par Shai Avidan et Ariel Shamir qui s'intitule "Seam Carving for Content-Aware Image Resizing". Plus des détails peuvent être trouvés dans l'article et donc dans ce travail pratique, on va implémenter l'algorithme de base présenté.

Description d'approche

L'idée de cette approche est de déterminer tout d'abord l'importance de chaque pixel en utilisant une fonction d'énergie, ce qui soit le gradient, l'entropie, segmentation ou bien l'Histogramme de Gradient (HOG) dans un pixel.
Une fois la fonction d'énergie de chaque pixel est bien déterminée, on passe en suite à chercher un jont, qui est un chemin reliant un côté de l'image à l'autre en sélectionnant un seul pixel pour chaque linge (colonne), avec le moins d'importance selon une dimension d'image (horizontallement ou verticallement). L'image sera découpée en retirant ce joint.

Détails d'approche (définitions et variables correspondantes dans les codes)

La fonction d'énergie a été obtenue (principalement) par le gradient de chaque pixel. Elle peuve est trouvée dans 'RGBenerg.m'. À fin de trouver le joint optimal vertical, on départ de traverser l'image à partir de la deuxième ligne jusqu'à la dernière ligne en calculant l'énergie cumulative pour chaque pixel, en comparant ses trois côtés en haut(pour les bords, seulement deux côtés en haut), comme ci-joint :

Algorithme_1

On continue à passer ligne par ligne, avec le même principe :
Algorithme_2

À la fin de ce process, la valeur minimume dans la dernière ligne d'image indique la fin du joint optimal. Alors, on revient à partir de la position du joint optimal pour trouver le chemin du coût d'énergie minimume :
Algorithme_3
(source : Seam Carving (Wikipédia))

Ce process est réalisé dans "trvjoint.m". Et la variable "M_ver" est l'énergie cumulative enregistrée, et puis "jt_opt" correspond au joint optimal. C'était 0 par tout avec les dimensions comme la matrice gradient (l'énergie). Pendant la recherche du joint optimal, s'il un pixel est dans le chemin du joint, on le met "0", sinon "1". Du coût, on aura une matrice logique du joint optimal, et les postions de la valeur "0" est le joint optimal voulu.

En retirant le joint optimal, l'image sera redimensionnée. Pour faire cela, on trouve un vecteur qui comporte tous les positions de la valeur "0" (c_op) dans le joint optimal, et les comparer avec les colonnes (j) de l'image. Si 'j' est inférier à 'c_op', on ne change pas l'intensité du pixel correspondant, mais 'j' est égale à et supérier à 'c_op', on copie l'intensité du pixel 'j+1' au pixel 'j' colonne par colonne et on enlève alors la dernière colonne. Tout cela permet de découper l'imamge originale juste un joint. On fait répéter le processe pour obtenir les résultats voulus.

Résultats et Commentaires

Voici les résultats obtenus:

tower result-tower

house_by_jim_mccann result-house_by_jim_mccann

yo_couch_by_yuan2003 result-yo_couch_by_yuan2003

max_in_windsor result-max_in_windsor

Malheureusement, il y a des mauvais résultats avec le même code. Mais cela est assez bizzare :

result-00911v

Et son déplacement et les valeurs minimumes sont :

On a vu ici que le premier résultat est le meilleur. À cause qu'on a juste essayé la fonction d'énergie avec le gradient d'image, donc les autre types des fonctions d'énergie pourrient marcher mieux. Et le probème semble que l'algorithme a seulment trouvé les joints optimals dans la partie droite d'image. Ceci peut être le lirement des images ou matrices commece de droite à gauche, dans le cas où il y a des plusieurs valeurs minimumes de coût (0), le programme ne connaitre que les partie droites. Evidamment il faudrais améliorer le programme, les autre types de fonction d'énergie seraient bien réalisés.

Conclusions

Ce projet nous permet de bien comprendre la notion de redimensionner les images sans perdre des information. L'idée de "Seam Carving for Content-Aware Image Resizing" est génial, mais des détails de réalisation n'est pas évident. À partir des résultats, le renforcement de compétence de programmer reste à bien améliorer.