algorithmique (école d'ingénieur) · Chapitre 6 · Exercice de TD
Projet : une vraie image
Redimensionner une image : le seam carving · niveau 3 (difficile)
Énoncé
La classe javax.imageio.ImageIO lit et écrit des images :
BufferedImage img = ImageIO.read(new File("photo.png"));
La méthode getRGB(x, y) de BufferedImage retourne la couleur du pixel codée sur un entier (rouge, vert, bleu sur bits chacun).
- Écrire les fonctions de conversion d'une image en trois tableaux (rouge, vert, bleu) et réciproquement. Attention : dans un
BufferedImage, la ligne est en haut. - Réduire la largeur d'une image de en retirant les coutures dans les trois tableaux, l'énergie étant calculée sur les niveaux de gris (moyenne des trois composantes).
- Comparer visuellement avec une mise à l'échelle et un recadrage.
Corrigé
- On range les composantes dans trois tableaux dont la ligne est celle du bas, comme dans le chapitre :
static int[][][] composantes(BufferedImage img) {
int W = img.getWidth(), H = img.getHeight();
int[][][] T = new int[3][H][W];
for (int y = 0; y < H; y++)
for (int x = 0; x < W; x++) {
int p = img.getRGB(x, y), l = H - 1 - y; // y = 0 en HAUT dans BufferedImage
T[0][l][x] = (p >> 16) & 255; T[1][l][x] = (p >> 8) & 255; T[2][l][x] = p & 255;
}
return T;
}
static BufferedImage image(int[][][] T) {
int H = T[0].length, W = T[0][0].length;
BufferedImage img = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB);
for (int l = 0; l < H; l++)
for (int c = 0; c < W; c++)
img.setRGB(c, H - 1 - l, (T[0][l][c] << 16) | (T[1][l][c] << 8) | T[2][l][c]);
return img;
}
- À chaque étape, on calcule les niveaux de gris, la couture, et l'on retire la même couture des trois tableaux :
int k = (int) (0.3 * img.getWidth());
for (int i = 0; i < k; i++) { // RVB a perdu i colonnes
int[][] gris = gris(RVB); // moyenne des trois composantes
int[] col = couture(calculerM(energie(gris)));
for (int j = 0; j < 3; j++) RVB[j] = retirer(RVB[j], col);
}
ImageIO.write(image(RVB), "png", new File("apres.png"));
Le programme Ex6_10Photo.java accepte une image en argument ; sans argument, il fabrique un paysage de synthèse (ciel en dégradé, sol uni, deux arbres) :
300 x 160 -> 210 x 160
- Une mise à l'échelle déforme les arbres (ils deviennent plus étroits), un recadrage en supprime un ; le seam carving retire surtout du ciel et du sol, zones de faible énergie, et garde les deux arbres intacts (le programme vérifie que les pixels des arbres sont tous conservés). Sur une photographie réelle, les défauts apparaissent quand l'image n'a plus de zones uniformes : les coutures traversent alors des objets et les déforment.
100 % gratuit
La suite du chapitre est sur Adloun
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
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.