Adloun

algorithmique (école d'ingénieur) · Chapitre 6 · Exercice de TD

Retirer colonnes

Redimensionner une image : le seam carving · niveau 2

Énoncé

  • Écrire une fonction int[][] reduire(int[][] I, int k) qui retire coutures verticales.
  • Pourquoi faut-il recalculer les énergies après chaque couture ?
  • Mesurer le temps de calcul pour des images aléatoires de taille , , avec . Les mesures sont-elles compatibles avec ?

Corrigé

-


static int[][] reduire(int[][] I, int k) {
    for (int i = 0; i < k; i++) {                // I a perdu i colonnes
        int[][] M = calculerM(energie(I));
        I = retirer(I, couture(M));              // couture : colonnes du chemin minimum
    }
    return I;
}
  • Retirer une couture rapproche des pixels qui n'étaient pas voisins : les énergies des pixels situés le long de la couture changent. Les garder fausserait les coutures suivantes. (Une implémentation fine ne recalcule que les énergies voisines de la couture, mais le tableau doit, lui, être recalculé en entier.)
  • Chaque couture coûte (énergies, , retrait), donc coutures coûtent , soit si et : doubler doit multiplier le temps par environ .

largeur après 4 coutures : 6
L = C = 200, k = 100 : 0,038 s (largeur finale 100)
L = C = 400, k = 200 : 0,294 s (largeur finale 200)
L = C = 800, k = 400 : 3,152 s (largeur finale 400)

Les rapports observés ( puis ) sont proches de ; le second est un peu plus grand car les tableaux de ne tiennent plus dans les mémoires caches du processeur. Les temps dépendent de la machine.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →