Date limite: 22 février 2015 à 23h59
Due Date: 23h59 on February 22, 2015
Un des problèmes qui a reçu beaucoup d'attention ces dernières années en recherche est celui du redimensionnement automatique d'images: comment faire pour redimensionner une image sans toutefois perdre son contenu? Un des articles les plus importants sur ce sujet a été publié récemment à SIGGRAPH et s'intitule Seam Carving for Content-Aware Image Resizing par Shai Avidan et Ariel Shamir. Dans ce travail, vous allez implémenter l'algorithme de base présenté dans cet article. Vous concevrez un programme qui pourra rétrécir une image dans une dimension donnée (horizontalement ou verticalement) en retirant une à une les colonnes (ou les lignes) de l'image contenant le moins d'information.
One of the recent papers at SIGGRAPH that made news was Seam Carving for Content-Aware Image Resizing by Shai Avidan and Ariel Shamir. In this assignment, you'll be implementing the basic algorithm presented therein. To wit, you'll be designing a program which can shrink an image (either horizontally or vertically) to a given dimension.
Voici un lien vers une vidéo qui présente une courte description de l'algorithme et montre des résultats intéressants. Votre algorithme devra rétrécir la taille de vos images en appliquant l'algorithme suivant:
Vous pouvez utiliser les fonctions d'énergie proposées dans l'article, ou vous pouvez aussi en proposer une autre (que vous devrez expliquer et justifier). Définir une bonne fonction d'énergie est essentiel pour obtenir de bons résultats.
For a brief overview of the algorithm and some inspiring results, check out the video. Your algorithm will shrink images as follows:
Feel free to use any energy function in the paper (or cook up something on your own---that you must explain and justify). Defining a good energy function seems to be the key to achieving good results.
Un joint horizontal est un chemin reliant un côté de l'image à l'autre en sélectionnant exactement un seul pixel pour chaque colonne. (Un joint vertical est semblable, mais celui-ci relie le haut et le bas de l'image, et contient un seul pixel par rangée.) Trouver le joint avec le moins d'importance peut être fait de façon efficace avec la programmation dynamique. Pour plus de détails, référez-vous à l'article original.
Votre code final devra pouvoir, étant donnée une image d'entrée, produire une image de sortie rétrécie d'un nombre donné de pixels, soit en largeur ou en hauteur (pas nécessairement les deux à la fois). Pour ce faire, il est beaucoup plus simple d'écrire votre code pour une seule dimension, puis transposer l'image pour la rétrécir dans l'autre dimension.
A horizontal seam is a connected path from one side of the image to the other that chooses exactly one pixel from each column. (A vertical seam is the same, but from top to bottom and with rows.) Finding the lowest-importance seam is a simple dynamic programming exercise. This is pretty well explained in the article of Avidan and Shamir.
Your final code should be able to, given an input image, produce an output image shrunk by a given number of pixels either in width or in height (but not both at once!). A simple way to achieve this goal is to write your code to shrink only in one dimension and then create a wrapper function that transposes the image to shrink in the other dimension.
Remarquez comment le contenu de l'image est conservé et que la grande section (plutôt inutile et déprimante) d'asphalte est retirée.
Notice how the content in the image is preserved, and the large, boring, area of asphalt is removed.
Lorsque vous poussez l'algorithme à ses limites, des artefacts---comme des distorsions de formes et des angles cubistes étranges---apparaîtront dans l'image. Peaufinez votre code pour atténuer ces effets et tentez de comprendre sur quels types d'images ces effets se produisent. Généralement, des scènes hautement structurées et les images contenant des visages en souffriront, tandis que les scènes contenant des objets texturés sur de simples arrière-plans devraient mieux fonctionner.
As you push the algorithm to its limits, artifacts -- such as shape distortions and odd cubist angles -- will begin to crop up. A lot of time on this project will be spent tweaking your code to mitigate these effects, as well as searching for pictures which don't exhibit them. Generally, highly-structured scenes and human faces will suffer, while scenes with textured objects on simple backgrounds will work better.
Approfondissez vos connaissances (et augmentez votre note) en essayant d'implémenter les idées suivantes:
Try one of these ideas to increase your understanding on this subject (and increase your score):
Comme pour le TP précédent, vous devrez soumettre votre code et une page web simple illustrant vos résultats et contenant une courte discussion sur ceux-ci. Pour vous aider à démarrer, nous vous fournissons une ébauche de page web (facultative). L'apparence esthétique du site Web ne sera pas évaluée, mais il est important que les informations soient clairement présentées.
Plus précisément, la page devrait contenir:
As in the previous homework, this one will be handed in a webpage format. Remember: the aesthetics of the website will not be evaluated, but it is important that the information be presented clearly.
More precisely, the webpage should:
Ce travail est évalué sur 100 points:
This assignment is evaluated on 100 points, as follows:
Pour la remise de votre travail, créez un fichier tp2.zip
qui contient:
tp2/web
. Vos images doivent être dans un dossier tp2/web/images
.tp2/web/index.html
. De plus, assurez-vous qu'il n'y a aucun caractère spécial (accent, ponctuation, espace, etc.) dans les noms de vos fichiers, images, etc.tp2/code
. N'incluez pas les images que vous avez utilisées pour produire vos résultats dans ce dossier dans le but de ne pas alourdir le fichier.Finalement, veuillez téléverser votre fichier tp2.zip
sur pixel (http://pixel.fsg.ulaval.ca) avant la date limite. La politique des retards mentionnée dans le plan de cours sera appliquée. Pour toutes questions concernant la procédure de remise ou le travail lui-même, posez vos questions sur Piazza!
Attention! La taille limite permise sur Pixel est de 50MB. Assurez-vous que la taille du fichier tp2.zip
n'excède pas 50MB.
For this homework, you must create a tp2.zip
file. In this file you'll put:
tp2/web
. Your images for this web page should be inside a folder named tp2/web/images
.tp2/web/index.html
. Make sure none of the files have special characters (e.g. accents, punctuation, spaces, etc.) in their filenames. tp2/code
. Do not include the images you have used to generate your results inside this folder, as this will likely generate huge files.
Finally, you should upload this file (tp2.zip
) on pixel (http://pixel.fsg.ulaval.ca) before the deadline. The late submission policy described in the course plan will be applied. For any question regarding the submission process or the project as such, ask your questions on Piazza!
Beware! File size limit on Pixel is 50MB. Make sure that your tp2.zip
file size does not exceed 50MB.
Merci à Alyosha Efros d'avoir créé le TP original qui a servi d'inspiration pour celui-ci!
Many thanks to Alyosha Efros for creating the assignment which inspired this one!