Le seuillage

Seuillage avec Python

Le seuillage est la technique qui transforme une image en niveaux de gris en image binaire (généralement noir et blanc). Attention, on ne transforme pas directement une image en couleurs.

En page de profondeur de couleur vous trouverez une photo de puma en niveaux de gris et cette même image retraitée avec un seuil de \(50\%.\) Réalisée à partir d'une photo de meilleure qualité que ci-dessous, vous pourrez remarquer que l'image binaire montre des détails plus fins.

 

Problématique

La plupart des logiciels de retouche photo ne vous permettent pas de choisir le seuil à partir duquel le gris devient noir. Or, selon les images, le seuil peut être choisi différemment, soit pour équilibrer les zones de blanc et de noir soit pour faire apparaître un détail important. La souplesse d’un programme en Python n’étant plus à démontrer, c’est l’option que nous choisirons ci-dessous.

Nous travaillerons à partir de l’image suivante (puma_2.jpg).

niveaux de gris

 

Suggestion de programme

# Importation de la classe Image depuis la bibliothèque Pillow

from PIL import Image

# L’image puma_2 se trouve dans le même dossier que le programme, création de l’objet pumaseuil

pumaseuil = Image.open("puma_2.jpg")

# On relève les dimensions de l’image. Il est inutile de les connaître

largeur,hauteur = pumaseuil.size

# '1' signifie codage sur 1 bit

pumabin = Image.new('1',(largeur,hauteur))

# invite pour que l’utilisateur choisisse un seuil

seuil = int(input("Seuil choisi ? (entre 0 et 255) "))

for y in range(hauteur):
    for x in range(largeur):
        intensite = pumaseuil.getpixel((x,y))
        if (intensite > seuil):
            pumabin.putpixel((x,y),1)
        else:
            pumabin.putpixel((x,y),0)

pumabin.save("pumaseuil.tif", quality = 100)

Notez que le format de l’image sauvegardée est TIF et non JPG puisque celui-ci ne gère pas les images en noir et blanc.

 

Essais

Si l’on entre la valeur 127, qui correspond à un seuillage de \(50\%\) :

seuil 127

Plus de blanc avec une valeur de 100…

seuil 100
… et plus de noir avec 150 :

seuil 150

 

Changer une couleur

En guise de bonus, voyons comment remplacer le noir par du rouge (à partir de notre image au seuil de 100).

Inutile de chercher le tuple du rouge, c’est (255, 0, 0).

Suggestion de programme :

from PIL import Image

pumaseuil = Image.open("pumaseuil.tif")
largeur,hauteur = pumaseuil.size

# 'P' signifie qu'on se limite à 256 couleurs (8 bits)

pumabin = Image.new('P',(largeur,hauteur))

for y in range(hauteur):
    for x in range(largeur):
    pixel = pumaseuil.getpixel((x,y))
    if (pixel == 0):
        pumabin.putpixel((x,y),(255,0,0))
    else:
        pumabin.putpixel((x,y),(255,255,255))
    
pumabin.save("pumarouge.tif")

rouge et blanc

 

échecs