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).
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\%\) :
Plus de blanc avec une valeur de 100…
… et plus de noir avec 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")