Aller au contenu principal

Informatique · Seconde · 6 min de lecture

Traiter une image avec un programme

Transformer une image par programme en agissant sur les trois composantes de chaque pixel : passage en niveaux de gris par moyenne des composantes R, V, B, négatif (255 − c pour chaque composante), seuillage, extraction de contours par comparaison de pixels voisins ; rôle des algorithmes dans les appareils photo (exposition, mise au point, balance des blancs, fusion d'images, compression).

Chapitre du programme : Sciences numériques et technologie

Bloc 1 sur 7 · Comprendre

Comprendre : agir sur chaque pixel

Une image numérique est un tableau de pixels. La couleur de chaque pixel est donnée par trois composantes : rouge (r), vert (v) et bleu (b), chacune un entier de 0 à 255. (0, 0, 0) est le noir, (255, 255, 255) le blanc.

Traiter une image par programme, c'est parcourir tous ses pixels et calculer, pour chacun, de nouvelles composantes. Ici, une petite image de deux lignes de trois pixels, passée en niveaux de gris : chaque pixel prend pour ses trois composantes la partie entière de la moyenne, g = (r + v + b) // 3. L'image est un tableau de lignes, chaque ligne un tableau de pixels, chaque pixel un p-uplet (r, v, b) ; la boucle for (r, v, b) in ligne range les trois composantes de chaque pixel dans r, v et b.

image = [
    [(200, 30, 40), (90, 90, 90), (10, 250, 70)],
    [(255, 255, 255), (0, 0, 0), (130, 60, 220)],
]

def gris(image):
    resultat = []
    for ligne in image:
        nouvelle = []
        for (r, v, b) in ligne:
            g = (r + v + b) // 3
            nouvelle.append((g, g, g))
        resultat.append(nouvelle)
    return resultat

print(gris(image))
[[(90, 90, 90), (90, 90, 90), (110, 110, 110)], [(255, 255, 255), (0, 0, 0), (136, 136, 136)]]

Le quotient entier // garde des composantes entières, comme il se doit.

Bloc 2 sur 7 · Approfondir

Approfondir : négatif, seuillage, contours

Négatif. Chaque composante c devient 255 − c : le noir devient blanc, une couleur claire devient sombre (même image que ci-dessus).

def negatif(image):
    resultat = []
    for ligne in image:
        nouvelle = []
        for (r, v, b) in ligne:
            nouvelle.append((255 - r, 255 - v, 255 - b))
        resultat.append(nouvelle)
    return resultat

print(negatif(image))
[[(55, 225, 215), (165, 165, 165), (245, 5, 185)], [(0, 0, 0), (255, 255, 255), (125, 195, 35)]]

Seuillage. On calcule le niveau de gris, puis on le compare à un seuil : au-dessus, le pixel devient blanc (255), sinon noir (0). L'image n'a plus que deux couleurs. La première ligne r, v, b = 200, 30, 40 affecte trois valeurs à la fois, dans l'ordre.

r, v, b = 200, 30, 40
g = (r + v + b) // 3
if g > 120:
    g = 255
else:
    g = 0
print(g)
0

Contours. Un contour se repère là où deux pixels voisins ont des valeurs très différentes. Sur une ligne de niveaux de gris, on note les positions où l'écart avec le pixel suivant dépasse 50 (abs donne la valeur absolue, l'écart sans son signe) :

ligne = [20, 22, 21, 180, 182, 181, 30]
bords = []
for j in range(len(ligne) - 1):
    if abs(ligne[j + 1] - ligne[j]) > 50:
        bords.append(j)
print(bords)
[2, 5]

Les bords sont entre les pixels 2 et 3, et entre 5 et 6. Les résultats s'écrivent dans une nouvelle image : on compare ainsi toujours les valeurs d'origine.

Dans les appareils photo, des algorithmes interviennent à chaque prise de vue : réglage de l'exposition, mise au point, balance des blancs, fusion de plusieurs images, compression du fichier.

Bloc 3 sur 7 · Exemple

Exemple guidé : gris et négatif d'un pixel

Énoncé. Un pixel a pour composantes r = 131, v = 202, b = 47. Que valent son niveau de gris, et la somme des composantes de son négatif ?

Niveau de gris. r + v + b = 131 + 202 + 47 = 380 ; le quotient entier par 3 donne 126 (380 = 3 × 126 + 2).

r, v, b = 131, 202, 47
g = (r + v + b) // 3
print(g)
126

Négatif. Les composantes deviennent 255 − 131 = 124, 255 − 202 = 53 et 255 − 47 = 208 ; leur somme vaut 124 + 53 + 208 = 385 (c'est aussi 3 × 255 − 380).

r, v, b = 131, 202, 47
r2, v2, b2 = 255 - r, 255 - v, 255 - b
print(r2 + v2 + b2)
385

Seuillage à 120 ? 126 > 120 : le pixel deviendrait blanc, 255.

Bloc 4 sur 7 · Visualiser

Voir : un pixel, trois traitements

Pixel (200, 30, 40), un rouge assez vif :

Tableau : Traitement, Calcul, Résultat
TraitementCalculRésultat
Niveau de gris(200 + 30 + 40) // 3 = 270 // 3(90, 90, 90)
Négatif(255 − 200, 255 − 30, 255 − 40)(55, 225, 215)
Seuillage à 120gris 90, et 90 > 120 est faux(0, 0, 0), noir

Les valeurs du tableau sont celles calculées par les programmes de la leçon.

Continuez sur votre lancée

Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.

  • Les formules et les repères à retenir
  • Les erreurs fréquentes expliquées
  • Un exercice avec des aides et sa correction

L’accès gratuit comprend les cours et exercices de votre niveau choisi.

Sources

  • BO spécial n°1 du 22 janvier 2019 — programme de sciences numériques et technologie de seconde générale et technologique, annexe (https://cache.media.education.gouv.fr/file/SP1-MEN-22-1-2019/08/5/spe641_annexe_1063085.pdf) — thème « La photographie numérique », traitement d'image, rôle des algorithmes dans les appareils photo
  • Documentation officielle de Python 3, The Python Language Reference et The Python Standard Library (https://docs.python.org/3/) — opérateurs // (quotient entier) et /, listes et p-uplets

Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.

Explorer les autres cours

Accès rapide