TP2: Découpage d'images, par Louis Bourdages

Introduction et fonctionnement

Le redimensionnement d'images est toujours un compromis. Il est possible de conserver les proportions, mais cela n'est pas toujours désirable. Lorsq'on souhaite rendre l'image moins large ou moins haute, écraser l'image est rarement intéressant, et enlever les côtés cause une perte de contenu.

Le but du TP2 est d'implémenter un algorithme de redimensionnement intelligent qui enlève automatiquement les portions de l'image contenant peu d'information désirable (l'arrière-plan) et conserve les parties intéressantes (le sujet). Pour ce faire, on utilise la méthode connue sous le nom de seam carving.


Détails sur l'implémentation

Tout d'abord, l'image est tournée de 90 degrés si nécessaire. Cette opération sera le cas échéant effectuée dans le sens inverse à la fin, et permet d'éviter de gérer deux cas différents. L'image est aussi convertie en virgule flottante afin de conserver toute l'information lors des calculs subséquents.

Une fonction d'énergie est calculée sur l'image. On commence par calculer les dérivées verticales et horizontales pour chaque canal avec la fonction gradient. L'énergie associée à chaque pixel correspond à la sommme des valeurs absolues des dérivées verticales et horizontales de chaque canal.

On calcule ensuit le coût de joint associé à chaque pixel. Une colonne de valeur infinie est ajoutée à gauche et à droite de la matrice d'énergie afin d'éviter à avoir à gérer des cas limites. On définit que le coût de joint est égal à l'énergie pour la rangée du haut. Puis, pour les rangées subséquentes, le coût de chacun des pixels est égal à son énergie plus le coût le plus faible parmi ses trois voisins du haut. En pratique, cela est implémenté de manière vectorielle avec la fonction bsxfun. Les colonnes de valeur infinie de chaque côté sont finalement enlevées.

Le choix du joint possédant le coût moindre se fait de manière très simple: on part du pixel de la rangée du bas ayant le coût minimum, qu'on met dans un vecteur. Puis, on remplit le vecteur pour chaque rangée en sélectionnant l'indice du pixel adjacent de la rangée immédiatement au dessus dont le coût est le plus bas.

Le joint choisi est ensuite enlevé de l'image en itérant simplement sur la liste de d'indices et en copiant tous les pixels de la ligne excepté l'indice en cours dans une nouvelle matrice.

Ce processus est répété jusqu'à ce que le nombre désiré de lignes ait été enlevé.



Résultats sur les images fournies

Tour: -300 pixels

Image originale Résultat
Maison: -200 pixels

Image originale Résultat
Fresque: -200 pixels

Image originale Résultat
Rue: -300 pixels

Image originale Résultat

Résultats sur des images trouvées sur internet

Stockholm: -500 pixels
Source: https://www.flickr.com/photos/jameslosey/16508049691/sizes/k/

Image originale Résultat
Oiseau-requin: -200 pixels verticaux, -200 pixels horizontaux
Source: inconnue (contenu "viral")

Image originale Résultat
Guitares: -300 pixels
Source: Misha Mansoor

Image originale Résultat

On voit ici que les manches des guitares sont déformés. Cela s'est produit parce qu'il n'y a pas assez d'arrière-plan: toute l'image est occuppée par le sujet. Lorsque l'algorithnme arrive pour faire un choix, les colonnes de pixels où se situent les manches sont celles qui contiennent le moins d'énergie, et c'est donc le manche qui écope, tandis que le reste de l'instrument est pratiquement intouché.

Vélo: -300 pixels horizontaux
Source: http://www.pedalroom.com/bike/ritte-bosberg-1299, (la photo en question a été enlevée depuis)

Image originale Résultat

Ici, l'arrière-plan est très chargé, presqu'autant que le vélo. L'algorithme s'est attaqué aux roues puisqu'elles sont "lisses" (ne contiennent pas beaucoup de contenu fréquentiel élevé) sur le plan vertical. Le cadre du vélo est relativement intouché puisque les nombreux tubes contribuent à augmenter de beaucoup le coût des joints qui y passent.

Vélo: -300 pixels verticaux
Source: http://www.pedalroom.com/bike/ritte-bosberg-1299, (la photo en question a été enlevée depuis)

Image originale Résultat

Le résultat est déjà plus acceptable, puisque le ciel est relativement exempt d'arrêtes. Seul le tube de selle a été touché de manière significative, mais le reste du vélo, créant beaucoup d'énergie lorsqu'on regarde sur le plan horiozntal, est intact.



Résultats sur mes propres images

Panorama de Québec: -320 pixels

Image originale Résultat

On voit ici très bien que l'algorithme peut servir à enlever du contenu indésirable. Les stores et le joint entre les deux fenêtres sont presqu'entièrement disparus, alors que le reste de l'image est pour la plupart intact.

Panorama du Lac-St-Jean: -800 pixels

Image originale Résultat
DeKoninck: -300 pixels

Image originale Résultat

Je qualifierais ceci de succès partiel. Du contenu a été enlevé partout sur le bâtiment (on l'aperçoit bien en regardant les colonnes à la base) puisqu'il y a des bandes verticales sans beaucoup d'arrêtes, mais le gros du redimensionnement s'est produit dans les côtés, où les éléments architecturaux sont moins distincts. L'arbre au coin du bâtiment a sérieusement nuit a redimensionnement, puisqu'il ajoute beaucoup d'énergie à l'image.

Café: -150 pixels

Image originale Résultat

Cette image démontre une chose: il est parfois plus approprié de rogner l'image que de redimensionner "intelligemment". La tasse a été majoritairement épargnée, mais comme le sujet est au milieu et que contenu enlevé est en haut et en bas de l'image, enlever ces régions entièrement aurait donné un meilleur résultat.