Traitement d'images

Cette activité est très inspirée des activités de Gilles Lassus et Stéphane Colomban.

Quelques exemples

De nombreux algorithmes de traitement d'image permettent de modifier une image numérique, à plusieurs fins. Voici quelques exemples.

Ajout de personnes absentes de la photo originale

_primary
113th congress usa women version altered by office of House Minority Leader.jpg, original de US Congress, modifié par Office of the House Minority Leader, domaine public.

Quatre personnes, qui n'ont pu arriver à temps, ont été ajoutées après la prise de la photo.

Flou artificiel de l'arrière-plan

_primary
Faux-bokeh-comparison, par BenFrantzDale, retouché par Cmglee, publié sous licence Creative Commons by-sa 3.0.

La photo originale (1) a été altérée pour flouter l'arrière plan, en utilisant deux méthodes différentes (2 et 3).

Prise de vue en fourchette

Série d'images d'une mouche tachinaire montrant l'intérêt de la Prise de vue en fourchette. Les deux première images montrent les problèmes de profondeur de champ rencontrés, la troisième a été obtenue en combinant six clichés réalisés avec six mises au point différentes.

Assemblage de photos

_primary
Rochester NY, par Noso1. The copyright holder of this file allows anyone to use it for any purpose, provided that the copyright holder is properly attributed. Redistribution, derivative work, commercial use, and all other use is permitted.

Plusieurs photos différentes sont assemblées pour donner l'illusion d'une seule photo panoramique.

Correction de la perspective

La photo prise avec une lentille fisheye (en haut) a été altérée pour corriger la perspective.

Fausse miniature

En floutant numériquement la photo de gauche, la photo de droite donne l'impression d'une photo de modèle réduit.

Questions

  1. Classer les six exemples de manipulation d'image dans les trois catégories suivantes (plusieurs réponses sont possibles) :

    1. Algorithmes essayant de reproduire le plus fidèlement possible la réalité.
    2. Algorithmes essayant d'imiter ou de créer un effet artistique.
    3. Algorithmes produisant l'image d'une situation qui n'a jamais existé.
  2. Citez deux autres exemples de filtres (que vous utilisez peut-être), et classez-les dans les catégories de la question précédente.

  3. Dans quelle mesure peut-on considérer qu'une photographie est une preuve ?

Pratique

Travail préparatoire

  1. Télécharger dans un même dossier (par exemple snt/photo/traitement les fichiers traitement-d-image.py et gere.jpg.
  2. Ouvrir le fichier traitement-d-image.py avec Thonny, l'exécuter, choisir la photo gere.jpg puis l'action Symétrie haut-bas, et vérifier que la symétrie a bien été effectuée.
  3. Complétez le programme pour mettre en œuvre autant des algorithmes suivants que possible. Réalisez-les dans l'ordre de votre choix, sachant qu'ils sont à peu près classés par ordre de difficulté croissant.
  4. Une fois votre travail terminé, renommez le fichier en traitement-d-image-NOM1-NOM2.py (avec vos deux noms de famille), et rendez-les dans le dossier partagé de la classe.

Explication du code

Chaque action (algorithme de traitement d'image) est défini dans une fonction, ressemblant à la fonction suivante.

def action_eclaircir(nom):
    """Éclaircit l'image"""
    source = Image.open(nom).convert('RGB')
    largeur = source.width
    hauteur = source.height
    dest  = Image.new('RGB', (largeur, hauteur))

    for x in range(largeur):
        for y in range(hauteur):
            rouge, vert, bleu = source.getpixel((x, y))
            dest.putpixel(
                    (x, y),
                    (0, 0, 0), # À compléter avec la couleur du pixel
                )

    dest.save("eclaircie.png")
    dest.show()

Dans les premières lignes (de source = … à dest = …), le programme lit le fichier source, lit la largeur et la hauteur de l'image (nous en auront besoin pour certains des algorithmes), et prépare l'image de destinantion. Vient ensuite la double boucle :

for x in range(largeur):
    for y in range(hauteur):
        rouge, vert, bleu = source.getpixel((x, y))
        dest.putpixel(
                (x, y),
                (0, 0, 0), # À compléter avec la couleur du pixel
            )

Dans cette double boucle, les variables x et y prennent successivement les coordonnées de tous les pixels de l'image source. Ensuite, les couleurs d'un pixel (sous la forme de trois nombres rouge, vert, bleu) sont lues avec la fonction source.getpixel(), puis un pixel est écrit avec la fonction dest.putpixel(). Cette fonction prend deux arguments : les coordonnées du pixel à écrire, et les couleurs du nouveau pixel.

Assombrir l'image

Cette action est définie dans la fonction action_assombrir().

Pour assombrir une image, les couleurs de chaque pixel vont être rapprochées du noir (0, 0, 0). Pour cela, le nombre de chaque couleur va être divisé par 2. Attention : pour faire la division, utiliser l'opérateur // plutôt que /.

Convertir l'image en niveaux de gris.

Cette action est définie dans la fonction action_niveaux_de_gris().

Les trois couleurs de chaque pixel de l'image finale sont égale à la moyenne des trois couleurs de l'image initiale.

Inverser les couleurs

Cette action est définie dans la fonction action_inverse().

Pour chacune des trois couleurs, 0 devient 255, 1 devient 254, 2 devient 253, etc. À quelle opération cela correspond-il ?

Effectuer la symérie gauche-droite

Cette action est définie dans la fonction action_symetrie_gauchedroite().

Pour écrire cette fonction, adapter la fonction action_symetrie_hautbas().

Éclaircir l'image

Cette action est définie dans la fonction action_eclaircir().

C'est le même principe que pour assombrir l'image, sauf que les couleurs devront être rapprochées du blanc (255, 255, 255) au lieu du noir. Quelle opération faut-il alors effectuer ?

Pivoter l'image de 90° vers la gauche

Cette action est définie dans la fonction action_rotation90().

Les couleurs ne sont pas modifiées, mais il faut calculer à quel endroit le pixel d'origine doit être repositionné. Faites un schéma au brouillon pour vous aider.