Traitement d'images





Bien sûr, on enregistre l'image dans son répertoire de travail Python. Voilà un programme qui va nous donner les dimensions de l'image comme précédemment et cerise sur le gâteau, qui nous affiche l'image. Il faudra refermer la fenêtre pour relancer le programme. On change d'image, on télécharge celle là


C'est l'une des images les plus utilisées depuis 1973 pour s'essayer au traitement d'image, elle s'intitule Lena et comporte un mélange de détails, d'aplat de couleurs, de textures et d'ombres et permet de tester une grande variété d'algorithmes de filtrage, de segmentation ou de compression. C'est certainement l'une des premières images présentée aux étudiants ou au public quand on parle de traitement d'images et par cette célébrité, on la surnomme « La première dame d'Internet ».


# -*- coding: utf-8 -*-

import matplotlib.image as mpimg

img = mpimg.imread("lena.png")


import numpy as np # Si le résultat n'est pas un tableau d'entiers

if img.dtype == np.float32:

    img = (img * 255).astype(np.uint8)


print(img.shape) # va afficher dans la console les dimensions du tableau donc la taille de l'image, et le nb d'information par pixel (3 ou 4)


import matplotlib.pyplot as plt

plt.imshow(img)

plt.show() # va afficher l'image


Copier le programme suivant dans la moulinette...


# -*- coding: utf-8 -*-

import matplotlib.image as mpimg

img = mpimg.imread("lena.png")


import numpy as np # Si le résultat n'est pas un tableau d'entiers

if img.dtype == np.float32:

    img = (img * 255).astype(np.uint8)


print(img.shape)

r,v,b,t=img[100,250]

print("canal rouge : ",r,"canal vert : ",v,"canal bleu : ",b,"transparence :",t)


Vous pouvez voir s'afficher  le canal rouge, le canal vert, le canal bleu et la transparence du pixel de coordonnées (100,250) de l'image "lena.png"


Exercice 1 : Modifiez le programme pour qu'il affiche les valeurs du canal rouge, du canal vert et du canal bleu du pixel de coordonnées (250,300), notez le résultat.


Avant de commencer à écrire un programme qui nous permettra de travailler sur les pixels d'une image, il est nécessaire de préciser que chaque pixel a des coordonnées x,y.





Vous enregistrerez votre programme en tant que "programme 1 nom prénom" dans un répertoire dédié aux programmes python. 


Vous utiliserez ensuite ce programme, il supprime la moitié du rouge, Léna va devenir un peu verte.


# -*- coding: utf-8 -*-

import matplotlib.image as mpimg

img = mpimg.imread("lena.png")


import numpy as np # Si le résultat n'est pas un tableau d'entiers

if img.dtype == np.float32:

    img = (img * 255).astype(np.uint8)


y,x,z =img.shape

for i in range(x):  # on parcourt toute l'image ligne par ligne

       for j in range(y): # on parcourt toute l'image colonne après colonne

               r,v,b,t=img[j,i] 

               r=r/2 # on enlève la moitié du rouge

               img[j,i]=r,v,b,


import matplotlib.pyplot as plt

plt.imshow(img)

plt.show()


Exercice 2 :  Bon aller, à partir du programme précédent faites moi une Léna bien verte en enlevant tout le rouge et tout le bleu. Vous avez réussi ? Vous venez d'appliquer un filtre spatial très simple.


Vous enregistrerez votre programme en tant que "programme 2 nom prénom" 



Exercice 3 : 


En conservant ce mode de programme


y,x,z =img.shape

for i in range(x):  # on parcourt toute l'image ligne par ligne

       for j in range(y): # on parcourt toute l'image colonne après colonne


Vous écrirez un programme qui donne une symétrie verticale de l'image de Léna.


Vous enregistrerez votre programme en tant que "programme 3 nom prénom"


Exercice 4 : Modifiez le programme de l'exercice 1 afin de colorier le pixel de coordonnées (100,250) en bleu.


 Et une croix blanche de deux pixels d'épaisseur sur la photo de Léna sur toute la hauteur et toute la largeur.


Vous enregistrerez votre programme en tant que "programme 4 nom prénom"


Exercice 5 : 


Toujours en conservant cette façon de faire


y,x,z =img.shape

for i in range(x):  # on parcourt toute l'image ligne par ligne

       for j in range(y): # on parcourt toute l'image colonne après colonne


Après avoir fait quelques recherches sur le "négatif d'une image", écrivez un programme qui donne le négatif de Léna (en couleur).


Vous enregistrerez votre programme en tant que "programme 5 nom prénom"


Exercice 6 : Avec deux boucles 'for', dessinez un carré "gold" plein de 100 pixel de coté pixel par pixel (la couleur or correspondra au Gold du code html). Sur l'image de Léna.

 

Vous enregistrerez votre programme en tant que "programme 6 nom prénom"


Exercice 7 : dessinez un cercle de 100 pixel de rayon et d'un pixel d'épaisseur (encore pixel par pixel, toujours avec des boucles for et un peu de trigonométrie).  Sur l'image de Léna.


Vous enregistrerez votre programme en tant que "programme 7 nom prénom"


Exercice 8 : 


Toujours en conservant cette façon de faire


y,x,z =img.shape

for i in range(x):  # on parcourt toute l'image ligne par ligne

       for j in range(y): # on parcourt toute l'image colonne après colonne


Léna en noir et blanc. Pas en nuance de gris, en noir et blanc. 

Si (r+v+b)< 155 ---> blanc

Si (r+v+b)>= 155 ---> noir

Bon, c'est moche, c'est normal.


Vous enregistrerez votre programme en tant que "programme 8 nom prénom"


Exercice 9 : 


Toujours en conservant cette façon de faire


y,x,z =img.shape

for i in range(x):  # on parcourt toute l'image ligne par ligne

       for j in range(y): # on parcourt toute l'image colonne après colonne


Aller, on va mettre Léna en nuances de gris, rappelez vous, le vert compte double, deux fois plus de récepteurs verts en gros dans nos rétines. Bon, si vous voulez vraiment faire les choses bien, ce qui est mieux pour votre note, le poids des couleurs est normalisé, par la CIE (Commission Internationale de l'Eclairage), dans sa norme 709. Il va falloir chercher un peu. Voir un peu plus

Petite astuce qui pourrait vous aider : en Python pour avoir une division entière (le résultat est un entier), il faut utiliser l'opérateur // à la place de l'opérateur / ou si votre dernier calcul n'est pas une division, on peut arrondir à l'entier le plus proche avec x = int(x)


Vous enregistrerez votre programme en tant que "programme 9 nom prénom"


Exercice 10 : dessinez un disque de 100 pixel de rayon au centre de l'image de Léna. Oui,je sais, c'est compliqué. On peut le faire en dessinant les rayons du cercle ou des lignes horizontales limitées pas les points limites sur le cercle de 100 pixels.


Vous enregistrerez votre programme en tant que "programme 10 nom prénom"




Créé avec HelpNDoc Personal Edition: Nouvelles et informations sur les outils de logiciels de création d'aide