Skip to content

Décider pixel par pixel : le seuil

Nos filtres appliquent le même calcul à tous les pixels. Mais certains traitements demandent de choisir : rendre ce pixel-ci blanc, celui-là noir, selon sa couleur. Il nous manque une construction pour dire « si… sinon… ». C'est la dernière brique de notre langage, et elle sert partout en informatique.

Un exemple : le noir et blanc pur

Les niveaux de gris gardent tous les gris intermédiaires. Un noir et blanc pur, c'est plus radical : chaque pixel devient soit tout noir, soit tout blanc, rien entre les deux. La règle est simple :

Pour chaque pixel : calcule sa luminosité (la moyenne de ses composantes). Si elle dépasse 128, le pixel devient blanc. Sinon, il devient noir.

Le nombre 128 est le seuil : la barre au-dessus de laquelle on bascule d'un choix à l'autre.

D'abord sans machine

On ajoute à notre langage inventé la construction si CONDITION : suivie, en dessous et indenté, de ce qu'il faut faire quand la condition est vraie ; puis sinon : et ce qu'il faut faire quand elle est fausse. Comme pour répète, l'indentation délimite les blocs.

si luminosité > 128 :
    blanc
sinon :
    noir

Exercice - Appliquer la règle à la main

Voici les luminosités (déjà calculées) d'une image de 4 pixels sur 4. Applique la règle avec le seuil 128 : écris B (blanc) ou N (noir) pour chaque case.

40 200 210 35
190 60 55 220
205 50 45 195
30 215 190 25
Correction
N B B N
B N N B
B N N B
N B B N

Un damier. Remarque : 128 exactement ne dépasserait pas 128, donc donnerait noir. Avec un seuil, il faut toujours savoir de quel côté tombe l'égalité.

Exercice - Changer le seuil

Sur la même grille, qu'obtient-on avec un seuil de 50 ? Et de 250 ?

Correction

Avec 50 : presque tout dépasse, l'image est presque toute blanche (seuls 40, 45, 30, 25 et 50 lui-même restent noirs). Avec 250 : rien ne dépasse, l'image est toute noire. Le seuil règle la sévérité du tri : c'est un réglage, comme un paramètre.

En Python : if et else

La même construction existe en Python : si se dit if, sinon se dit else, et les blocs sont indentés, comme toujours.

luminosite = 200

if luminosite > 128:
    print("blanc")
else:
    print("noir")

Ce programme affiche blanc : la condition luminosite > 128 est vraie, donc c'est le bloc du if qui est exécuté, et le bloc du else est ignoré. Change luminosite en 90 : c'est l'inverse.

Le filtre noir et blanc pur

On assemble tout : le motif du filtre (lire, calculer, réécrire), la moyenne, et la décision. Et le seuil devient un deuxième paramètre de la fonction, pour rester réglable :

def noir_et_blanc(img, seuil):
    largeur, hauteur = img.size
    for y in range(0, hauteur):
        for x in range(0, largeur):
            r, v, b = img.getpixel((x, y))
            m = (r + v + b) // 3
            if m > seuil:
                img.putpixel((x, y), (255, 255, 255))
            else:
                img.putpixel((x, y), (0, 0, 0))

noir_et_blanc(essai, 128) donne le rendu classique ; noir_et_blanc(essai, 60) un rendu presque blanc ; noir_et_blanc(essai, 200) un rendu presque noir. Une seule fonction, tous les réglages : c'est le paramètre qui travaille.

Aller plus loin : dessiner les contours

Une belle application du seuil : extraire les contours d'une photo, comme un dessin au trait. L'idée : un contour, c'est un endroit où la luminosité change brutalement d'un pixel à son voisin. On compare donc chaque pixel à son voisin de droite :

Pour chaque pixel : calcule sa luminosité et celle de son voisin de droite. Si l'écart entre les deux dépasse un seuil, dessine un point noir (c'est un contour). Sinon, laisse blanc.

Deux différences avec nos filtres précédents, que tu verras dans le code sur Capytale : on écrit le résultat dans une nouvelle image (sinon on abîmerait les pixels qu'on doit encore lire), et la boucle sur x s'arrête une colonne avant le bord (le dernier pixel d'une ligne n'a pas de voisin de droite).

Ce qu'on retient

  • if condition: puis un bloc indenté, else: puis un bloc indenté : la machine exécute l'un ou l'autre, jamais les deux.
  • Un seuil est la barre qui fait basculer la décision ; on en fait un paramètre pour le régler à l'appel.
  • Noir et blanc pur : si la moyenne dépasse le seuil, blanc, sinon noir. Contours : si l'écart avec le voisin dépasse le seuil, noir.
  • Quand un traitement doit encore lire des pixels qu'il modifierait, on écrit le résultat dans une nouvelle image.
  • Le cours est ici ; on s'entraîne sur Capytale.

Et ensuite

Tu sais maintenant créer, transformer et trier des pixels. Dernière étape du thème : ce qu'une photo transporte en plus de ses pixels, et ce que ça change pour ta vie privée.