PYTHON
TRAITER LES IMAGES - 2ème partie

Utiliser une courbe tonale

Programme de base

Il s'agit d'appliquer, sur chaque pixel de l'image, le même filtre sur les trois composantes de couleur. La structure du programme reste toujours la même. Ci-dessous, la fonction ton() est à adapter selon l'effet désiré. La représentation graphique de cette fonction est la courbe tonale.

def ton(x) :
  ...
  return y

from PIL import Image
img = Image.open("pomme.jpg")

for x in range(0,img.size[0]) :
  for y in range(0,img.size[1]) :
    p=img.getpixel((x,y))
    img.putpixel((x,y),(ton(p[0]),ton(p[1]),ton(p[2])))

img.show()

Pour vos tests, vous pouvez télécharger l'image ci-dessous.

La fonction ton() doit retourner une valeur :

On peut donc la compléter :

def ton(x) :
  ...
  y=int(y)
  if y<0 :
    y=0
  if y>255 :
    y=255
  return y

Ou plus simplement :

def ton(x) :
  ...
  y=int(y)
  y=max(y,0)  
  y=min(y,255)
  return y

Obtenir le négatif

Le négatif d'une image s'obtient très simplement : Toutes les valeurs x des composantes de couleur sont remplacées par 255-x.

def ton(x) :
  y=255-x
  return y

Limiter la palette de couleurs

Si on laisse deux valeurs possibles pour chacune des trois composantes de couleur, la palette de couleurs se retrouve limités à huit couleurs.

def ton(x) :
  if x<127 :
    y=40
  else :
    y=215
  return y

Assombrir

Pour diminuer la luminosité, il suffit d'enlever une valeur fixe à chaque composante de couleurs.

def ton(x) :
  y=x-60
  if y<0 :
    y=0
  return y

Eclaircir

Pour augmenter la luminosité, il suffit d'ajouter une valeur fixe à chaque composante de couleurs.

def ton(x) :
  y=x+60
  if y>255 :
    y=255
  return y

Augmenter le contraste

Pour rendre une image plus contrastée, il faut assombrir les pixels foncés et éclaircir les pixels clairs.

def ton(x) :
  y=int(2*x-127)
  if y>255 :
    y=255
  if y<0 :
    y=0
  return y

Diminuer le contraste

Pour rendre une image moins contrastée, il faut assombrir les pixels clairs et éclaircir les pixels foncés.

def ton(x) :
  y=int(0.5*x+64)
  if y>255 :
    y=255
  if y<0 :
    y=0
  return y

Autres traitements classiques

Mélanger les couleurs

Il s'agit de remplacer, pour chaque pixel de l'image, la quantité de rouge par la quantité de bleu, la quantité de vert par la quantité de rouge... Plusieurs combinaisons sont possibles.

from PIL import Image
img=Image.open("paysage.jpg")

for x in range(0,img.size[0]) :
  for y in range(0,img.size[1]) :
    p=img.getpixel((x,y))
    img.putpixel((x,y),(p[1],p[2],p[0]))

img.save("gris.png")
img.show()

Convertir une image couleur en niveaux de gris

Dans une image en noir et blanc, chaque pixel est soit noir soit blanc. Dans une image en niveaux de gris, chaque pixel est gris, plus ou moins foncé. On part donc d'une image couleur. Une fonction retourne, à partir des trois composantes de couleur, un entier allant de 0 à 255. Dans l'exemple ci-dessous, à chaque composante de couleur est appliqué un coefficient pour donner un poids plus ou moins important à cette couleur. Les trois valeurs sont ensuite additionnées.

from PIL import Image
img=Image.open("paysage.jpg")

for x in range(0,img.size[0]) :
  for y in range(0,img.size[1]) :
    p=img.getpixel((x,y))
    g=int(0.3*p[0]+0.6*p[1]+0.1*p[2])
    img.putpixel((x,y),(g,g,g))

img.save("gris.png")
img.show()

Résultat :

   

Dessiner les contours d'une image

Il existe de nombreuses solutions pour obtenir les contours d'une image. Ici, on part d'une image en niveaux de gris. Pour un pixel donné et les pixels voisins, on compare les niveaux de gris, à l'aide du seuil s. Si les différences de niveaux de gris sont importantes, alors cela correspond à un contour.

from PIL import Image
img=Image.open("paysage.jpg")

for x in range(0,img.size[0]) :
  for y in range(0,img.size[1]) :
    p=img.getpixel((x,y))
    g=int(0.3*p[0]+0.6*p[1]+0.1*p[2])
    img.putpixel((x,y),(g,g,g))

img2=Image.new("RGB",(img.size[0],img.size[1]))
s=15
for x in range(1,img.size[0]) :
  for y in range(1,img.size[1]) :
    p=img.getpixel((x,y))[0]
    g=img.getpixel((x-1,y))[0]
    h=img.getpixel((x,y-1))[0]
    if abs(p-g)>s or abs(p-h)>s :
      img2.putpixel((x,y),(0,0,0))
    else :
      img2.putpixel((x,y),(255,255,255))

img2.show()

Résultat :