PYTHON
TRAITER LES IMAGES - 2ème partie

Objectif

Le but est de mettre en œuvre des filtres. Il s'agit, pour chaque pixel d'une image, de modifier chacune des trois composantes de couleur. La structure du programme, proposée ci-dessous, reste toujours la même : La fonction ton() est à adapter selon l'effet désiré. La représentation graphique de cette fonction se nomme 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()

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

Ou encore, en une seule ligne :

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

Comprendre

Pour vos tests, vous pouvez télécharger l'image ci-dessous, ou en choisir une autre.

Obtenir le négatif

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

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

Diminuer le contraste

Une image devient moins contrastée en assombrissant les pixels clairs et en éclaircissant les pixels foncés.

def ton(x) :
  y=0.5*x+64
  return int(y)

Augmenter le contraste

Une image devient plus contrastée en assombrissant les pixels foncés et en éclaircissant les pixels clairs.

def ton(x) :
  y=2*x-127
  return min(max(int(y),0),255)

Pratiquer

Assombrir, 1ère solution

Pour diminuer la luminosité, il suffit d'enlever une valeur fixe, 60 par exemple, à chaque composante de couleurs. Proposer une fonction ton() correspondant à la courbe tonale ci-dessous.

Assombrir, 2ème solution

Une variante consiste à assombrir beaucoup les couleurs claires et peu les couleurs foncées. Proposer une fonction ton() correspondant à la courbe tonale ci-dessous.

Eclaircir, 1ère solution

Pour augmenter la luminosité, il suffit d'ajouter une valeur fixe, 60 par exemple, à chaque composante de couleurs. Proposer une fonction ton() correspondant à la courbe tonale ci-dessous.

Eclaircir, 2ème solution

Une variante consiste à éclaicir beaucoup les couleurs foncées et peu les couleurs claires. Proposer une fonction ton() correspondant à la courbe tonale ci-dessous.

Limiter la palette de couleurs

En laissant 2 valeurs possibles pour chacune des trois composantes de couleur, la palette de couleurs se retrouve limités à 8 couleurs. Proposer une fonction ton() correspondant à la courbe tonale ci-dessous.

Approfondir

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("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),(p[1],p[2],p[0]))

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é. Pour chaque pixel d'une image couleur, un entier allant de 0 à 255 est calculé à partir des trois composantes de couleur. Dans l'exemple ci-dessous, à chaque composante de couleur est appliqué un coefficient pour lui donner un poids plus ou moins important.

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 :

   

Sauriez-vous modifier ce programme pour convertir l'image en noir et blanc?

De même en noir, gris et blanc?

Dessiner les contours d'une image

Il existe de nombreuses solutions pour obtenir les contours d'une image. Ici, on part de l'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 :