TP2 : Découpage d'images

TP2 : Découpage d'images

Claudia laramée


Description du projet

Au fil du temps, plusieurs techniques ont été développées afin de minimiser la perte de contenu d’une image suite au redimensionnement automatique. Une de ces techniques, mentionnée dans un article nommé Seam Carving for Content-Aware Image Resizing par Shai Avidan et Ariel Shamir, propose de se baser sur l’importance des pixels d’une image afin de produire automatiquement une image redimensionnée optimale. Ce projet consiste donc à implémenter notre propre algorithme de redimensionnement d'images en se basant sur les idées présentées dans l'article de Shai Avidan et Ariel Shamir.



Description de l'algorithme implémenté

En connaissant l’importance de chaque pixel, il est possible de trouver un ensemble de pixels à enlever de l’image afin de réduire la taille de celle-ci tout en conservant les éléments jugés importants.

Premièrement, il faut trouver une « fonction d’énergie » qui nous permettra de quantifier l’importance de chaque pixel d’une image. Il existe plusieurs fonctions d’énergie et chacune possède des avantages et des inconvénients relatifs à l’image sur laquelle elle est appliquée. Pour ce travail, j’ai choisi d’utiliser la somme des gradients en x au carré et des gradients des y au carré pour chaque pixel de l’image, tel que suggéré dans les notes de cours. Pour simplifier l'explication de la suite de l'algorithme, je vais référer à la matrice obtenue par la fonction d'énergie comme étant la matrice "gradient".

Suite à l’obtention d’une matrice, de même dimension que l’image originale, associant à chaque pixel la valeur de son importance, il est possible de déterminer quels pixels enlever pour optimiser le résultat final. En me référant au même article mentionné plus haut ainsi qu’aux notes de cours, j’ai pu constater qu’il existe plusieurs façons de choisir les pixels à enlever.

La technique optimale suggérée dans l’article amène le concept de chemin minimal. Dans le cas d’un redimensionnement horizontal, nous cherchons à trouver un chemin minimal qui part d’un pixel de la première ligne de l’image pour se rendre jusqu’à sa dernière ligne en minimisant la somme des pixels parcourus. Le chemin minimal doit aussi passer par un seul pixel de chaque ligne tout en s’assurant que les pixels d’une ligne à l’autre sont en contact (soit par un coin ou par une face). Cette dernière contrainte limite les possibilités de chemin minimal puisque d’une ligne à l’autre, on peut passer au pixel en dessous à gauche, directement en dessous, ou en dessous à droite seulement. Une fois le chemin minimal trouvé, il suffit d’enlever les pixels faisant partie de ce chemin pour réduire la taille de l’image et répéter l’opération autant de fois que désiré.

La technique de calcul de chemin minimal que j’ai utilisé dans le cadre de ce travail consiste, pour chaque pixel x de chaque ligne de la matrice "gradient", trouver lequel des pixels (en bas à gauche, directement en dessous ou en bas à droite) est le plus petit et à additionner la valeur du pixel x à celle du plus petit pixel. Aussi, simultanément dans une autre matrice de même dimension que l’image, on note pour chaque pixel, quel est le pixel suivant choisi (en bas à gauche : -1, directement en dessous : 0 ou en bas à droite : 1). Cette deuxième matrice servira de "carte" pour retrouver le chemin minimal. Après avoir répété ces étapes pour chaque ligne de la matrice "gradient", on peut trouver l’index de l’élément qui a la valeur minimale sur la dernière ligne et remonter la matrice "carte" pour trouver le chemin minimal et enlever les pixels de l’image réelle au fur et à mesure. On peut ensuite reprendre l’image réduite, recalculer la matrice "gradient" de la nouvelle image et trouver le nouveau chemin minimal et enlever les pixels correspondants.

Les derniers paragraphes décrivent l’algorithme servant au redimensionnement horizontal. Par contre, il est possible de réduire la taille d’une image verticalement en effectuant une rotation de 90 degrés de l’image et en appliquant l’algorithme de redimensionnement horizontal sur cette nouvelle image. Il est aussi possible de redimensionner verticalement et horizontalement une image en appliquant les deux algorithmes l'un à la suite de l'autre.



Résultats du redimensionnement horizontal


Largeur : 512 pixels
Hauteur : 384 pixels
Largeur : 362 pixels (70%)
Hauteur : 384 pixels
Largeur : 375 pixels
Hauteur : 500 pixels
Largeur : 275 pixels (75%)
Hauteur : 500 pixels
Largeur : 640 pixels
Hauteur : 434 pixels
Largeur : 440 pixels (70%)
Hauteur : 434 pixels
Largeur : 648 pixels
Hauteur : 432 pixels
Largeur : 448 pixels (70%)
Hauteur : 432 pixels

Il est possible de remarquer avec cette dernière image, la présence d'artéfacts dans l'image réduite, surtout au niveau des deux voitures et de la fenêtre de la banque. Ces artéfacts peuvent être expliqués par le contenu de l'image. En effet, l'image contient beaucoup d'éléments "importants" du point de vue de la fonction d'énergie utilisée. Cet aspect de l'image rend donc difficile la recherche d'un chemin minimal dans l'image et fait en sorte que les résultats obtenus ne sont pas optimaux. Pour remédier à ce proclème, il serait possible d'expérimenter avec d'autres fonctions d'énergie et comparer les résultats obtenus ou même d'implémenter un algorithme qui permet de protéger certains objets de l'image en augmentant leur valeur dans la matrice "gradient" afin de diminuer leur probabilité de se retrouver sur le chemin minimal.


Représentation de l'image selon la fonction d'énergie de la somme des grandients aux carrés
Largeur : 248 pixels (40%)
Hauteur : 432 pixels

Résultats du redimensionnement vertical


Largeur : 512 pixels
Hauteur : 384 pixels
Largeur : 512 pixels
Hauteur : 234 pixels (60%))
Largeur : 375 pixels
Hauteur : 500 pixels
Largeur : 375 pixels
Hauteur : 150 pixels (30%)
Largeur : 640 pixels
Hauteur : 434 pixels
Largeur : 640 pixels
Hauteur : 234 pixels (55%)

Encore une fois, il est possible de remarquer les artéfacts très présents sur la dernière image. Il serait possible d'appliquer les suggestions mentionnées plus haut afin de tester leur efficacité sur le redimensionnement vertical également.


Largeur : 648 pixels
Hauteur : 432 pixels
Largeur : 648 pixels
Hauteur : 282 pixels (65%)

Résultats du redimensionnement horizontal et vertical combiné


Largeur : 512 pixels
Hauteur : 384 pixels
Largeur : 362 pixels (70%)
Hauteur : 284 pixels (75%))
Largeur : 375 pixels
Hauteur : 500 pixels
Largeur : 225 pixels (60%)
Hauteur : 150 pixels (30%)
Largeur : 640 pixels
Hauteur : 434 pixels
Largeur : 490 pixels (75%)
Hauteur : 234 pixels (55%)
Largeur : 648 pixels
Hauteur : 432 pixels
Largeur : 498 pixels
75%)Hauteur : 282 pixels (65%)

Résultats sur d'autres photos


Largeur : 640 pixels
Hauteur : 400 pixels
source
Largeur : 440 pixels (70%)
Hauteur : 400 pixels
Largeur : 640 pixels
Hauteur : 300 pixels (75%)
Largeur : 800 pixels
Hauteur : 600 pixels
source
Largeur : 600 pixels (75%)
Hauteur : 600 pixels
Largeur : 800 pixels
Hauteur : 440 pixels (75%)

Tel que mentionné dans l'article de Shai Avidan et Ariel Shamir, les images comportants des visages sont plus suceptibles d'être déformées. En effet, surtout dans le cas de l'image ci-dessous, les proportions ds visages sont très altérées par l'algorithme de redimensionnement. Pour améliorer le résultat obtenu, il faudrait implémenter un algorithme de reconnaissance facial ou plus simplement un algorithme qui permet de protéger des zones spécifiques de l'image spécifiées par l'utilisateur.


Largeur : 802 pixels
Hauteur : 452 pixels
source
Largeur : 582 pixels (75%)
Hauteur : 452 pixels
Largeur : 800 pixels
Hauteur : 802 pixels (75%)
Largeur : 800 pixels
Hauteur : 600 pixels
source
Largeur : 600 pixels (75%)
Hauteur : 600 pixels
Largeur : 800 pixels
Hauteur : 440 pixels (75%)

Résultats de mes propres photos


Le résultat du redimensionnement de cette image est loin d'être optimal. En effet, en observant le résultat de la fonction d'énergie de l'image, on peut constater que la majorité des zones à faible importance se trouvent entre les rayons de la roue. Les chances que le chemin minimal passe au traver des rayons sont donc très élevées et c'est ce qui explique que lors du redimensionnement, ceux-ci ont l'air tordus.


Représentation de l'image selon la fonction d'énergie de la somme des grandients aux carrés
Largeur : 653 pixels
Hauteur : 490 pixels
Largeur : 453 pixels (75%)
Hauteur : 490 pixels
Largeur : 653 pixels
Hauteur : 360 pixels (75%)
Largeur : 653 pixels
Hauteur : 490 pixels
Largeur : 453 pixels (75%)
Hauteur : 490 pixels
Largeur : 653 pixels
Hauteur : 360 pixels (75%)
Largeur : 490 pixels
Hauteur : 653 pixels
Largeur : 340 pixels (75%)
Hauteur : 653 pixels
Largeur : 490 pixels
Hauteur : 483 pixels (75%)

Comme pour l'image de la roue de vélo présentée plus haut, on peut constater sur l'image de gauche que le pied du globe terrestre a une très faible importance dans l'image. C'est donc ce qui explique que lors du redimensionnement, celui-ci soit déformé et à la limite d'être effacé complètement dans le redimensionnement vertical. Par contre, on peut constater que l'algorithme a conservé l'objet le plus important, soit le globe lui-même, presque intacte dans les deux redimensionnements.


Représentation de l'image selon la fonction d'énergie de la somme des grandients aux carrés
Largeur : 490 pixels
Hauteur : 653 pixels
Largeur : 340 pixels (75%)
Hauteur : 653 pixels
Largeur : 490 pixels
Hauteur : 483 pixels (75%)

Analyse des résultats obtenus

Bien que lent sur de grosses images, l'algorithme que j'ai implémenté donne de bons résultats sur des images qui comportent quelques objets très importants bien définis entourés de régions de très faible importance. Il serait possible d'améliorer l'efficacité de mon algorithme en enlevant simplement le chemin-minimal à la matrice "gradient" à la place de recalculer celle-ci à chaque itération. Il serait également possible d'ajouter certaines fonctionnalités comme la détection de visages ou la protection de certains objets sur l'image pour améliorer les résultats obtenus.


Sources

Seam Carving for Content-Aware Image Resizing par Shai Avidan et Ariel Shamir
Notes de cours disponibles sur le site web du cours

Images trouvées sur internet :
Image 1
Image 2
Image 3
Image 4