Vous êtes sur la page 1sur 8

Fouad NAFIS Filière : MP

February 28, 2023 CPGE LYCEE OMAR IBN ALKHATTAB - MEKNÈS

Chapitre 10 : Traitement d’images

1 Introduction
Le traitement d’images est une discipline de l’informatique et des mathématiques appliquées qui étudie
les images numériques et leurs transformations, dans le but d’améliorer leur qualité ou d’en extraire de
l’information.
Une image numérique désigne, dans son sens le plus général, toute image qui a été acquise, traitée et
sauvegardée sous une forme codée et représentable par des valeurs numériques.

Le terme d’image numérique désigne, dans son sens le plus général, toute image qui a été acquise,
traitée et sauvegardée sous une forme codée représentable par des nombres (valeurs numériques).
La numérisation est le processus qui permet de passer de l’état d’image physique (image optique par
exemple) qui est caractérisée par l’aspect continu du signal qu’elle représente (une infinité de valeur
dans l’intensité lumineuse par exemple), à l’état d’image numérique qui est caractérisée par l’aspect
discret (l’intensité lumineuse ne peut prendre que des valeurs quantifiées en un nombre fini de points
distincts). C’est cette forme numérique qui permet une exploitation ultérieure par des outils logiciels
sur ordinateur.

2 Types d’images
2.1 Image en niveaux de gris
Une image numérique en niveaux de gris est représentée par une matrice à deux dimensions. Chaque
élément de la matrice est appelé : pixel. Chaque pixel contient un nombre entier compris entre 0 et 255.
Le nombre 0 correspond au noir, le nombre 255 correspond au blanc, et chacun des autres nombres 1,
2, 3,..., 253, 254 correspond à un niveau de gris entre le noir et le blanc. Ainsi l’image est codée sur 256
niveaux de gris.

Figure 1: Image en niveaux de gris et sous image de taille 5 × 5

2.2 Images couleurs


Une image matricielle est une matrice de points colorés appelés pixels (picture element). Chaque case
de la matrice contient la couleur du pixel correspondant. On convient de numéroter les colonnes en
partant de la gauche, et les lignes en partant du haut.

Cette couleur est représentée par un triplet de nombres entre 0 et 255 (3 octets) : un nombre pour
chaque couleur primaire rouge, vert et bleu ; c’est le format RGB (Red, Green, Blue). La couleur
Programmation Python 1 fouadnafis@gmail.com
Fouad NAFIS Filière : MP

Figure 2: Image couleur et ses canaux

définitive de chaque pixel est obtenue par addition de ces couleurs primaires.

Une image couleur est en réalité composée de trois images, afin de représenter le rouge, le vert, et
le bleu. Chacune de ces trois images s’appelle un canal. Cette représentation en rouge, vert et bleu
mime le fonctionnement du système visuel humain. On peut coder l’intensité de chaque couleur avec
une profondeur plus ou moins grande allant de quelques centaines à quelques millions de couleurs.
Couramment, on choisit 256 niveaux d’intensité pour une couleur et on la code sur 8 bits, de 0 (le plus
sombre) à 255 (le plus clair). Dans ce cas, un pixel couleur est donc un vecteur à dimension 3 contenant
3 entiers non signés sur 8 bits généralement encodés un uint8.
Une image couleur img est donc un tableau de dimension (largeur, hauteur, 3). L’accès à l’élément
img[i,j] renvoie un vecteur de taille 3

3 Manipulation des images en Python


3.1 Introduction
Les tâches courantes du traitement d’images incluent l’affichage des images, les manipulations basiques
comme le recadrage, le retournement, la rotation, ou encore la segmentation, la classification et les
extractions de caractéristiques, la restauration et la reconnaissance d’images. Python est un choix ju-
dicieux pour de telles tâches de traitement d’images. Cela est dû à sa popularité croissante en tant que
langage de programmation scientifique et à la disponibilité gratuite de nombreux outils de traitement
d’images de pointe dans son écosystème. Nous citons à titre indicatif les modules (Scipyn, PIL/Pillow,
Scikit Image, OpenCV-Python, ...etc.)

Nous allons opter dans nos manipulations aux deux bibliothèques matplotlib et PIL.
PIL (Python Imaging Library) est une bibliothèque open-source Python, qui prend en charge l’ouverture,
la manipulation et l’enregistrement de nombreux formats de fichiers d’image différents. Pillow est une
extension de PIL activement développée et plus facile à installer.

Il s’exécute sur tous les principaux systèmes d’exploitation et prend en charge Python 3. La bibliothèque
contient des fonctionnalités de traitement d’image de base, notamment des opérations ponctuelles, un
filtrage avec un ensemble de noyaux de convolution intégrés et des conversions d’espace colorimétrique

3.2 Créer une image en niveaux de gris


1. Chargez les bibliothèques numpy (pour manipuler des tableaux) et matplotlib.pyplot (pour
l’affichage graphique).
1 import matplotlib . pyplot as plt
2 import numpy as np

Programmation Python 2 fouadnafis@gmail.com


Fouad NAFIS Filière : MP
3 plt . set_cmap ( ’ gray ’)

2. Définissez la matrice :  
0 1 0 1
1 0 0 0
 
0 1 0 1
1 0 1 1
1 M = np . array ([[0 , 1 , 0 , 1] ,[1 , 0 , 0 , 0] ,
2 [0 , 1 , 0 , 1] ,[1 , 0 , 1 , 1]])

3. Affichez l’image correspondant à la matrice


1 plt . imshow ( M )
2 plt . show ()

4. A quoi correspond les entiers 1 et 0 de la matrice ?


1 M = np . array ([[240 , 121 , 10 , 16] ,[71 , 10 , 110 , 60] ,
2 [60 , 31 , 40 , 11] ,[101 , 30 , 81 , 21]])

5. Tirer un tableau 20 × 20 au hasard, et affichez le


1 a = np . random . rand (20 , 20)

6. Mettre toutes les valeurs de plus de 0.5 à 1, et celle de moins de 0.5 à 0.


1 a [ a > .5] = 1
2 a [ a <= .5] = 0

7. Sauvez le tableau obtenu sous forme d’une image de nom ”MonImage1.jpg”

3.3 Image couleur


8. Chargez l’image ”plage.jpg” (ou toute autre image couleur de votre choix).
1 import matplotlib . pyplot as plt
2 import numpy as np
3 im = plt . imread ( " D :\\ pandas . jpg " )

9. L’afficher.
1 plt . imshow ( im )
2 plt . show ()

10. Déterminer la taille (nombre de lignes, nombre de colonne) de l’image.


1 im = plt . imread ( " D :\\ pandas . jpg " )
2 t1 , t2 = im . shape [0] , im . shape [1]
3 print ( t1 , t2 )

Programmation Python 3 fouadnafis@gmail.com


Fouad NAFIS Filière : MP
11. Quel est le nombre de bits minimum, nécesaires pour coder un entier non signé compris entre 0 à
255 en binaire?

Avec n bits on peut représenter les entiers non signés de 0 à 2n − 1 donc 2n − 1 = 255
Ceci veut dire que 2n = 256 donc n=8

12. En déduire en Ko la taille de l’image ”plage.jpg” ou l’image que vous avez chargé?

Dons notre cas il s’agit d’une image 300 × 450 donc sa taille est : 300 × 450 = 135 000
Octets
Ce qui fait : 135 000 / 1000 ≃ 135 Ko ou exactement 135000/1024 = 131.84 Ko

3.4 Transformations
3.4.1 Négatif d’une image

Pour inverser les niveaux de gris d’une image, on remplace la valeur de chaque pixel MIJ par
la valeur de la différence 255 - Mij. Ainsi, les régions sombres deviennent claires, le noir devient
blanc, et vice versa.

13. Charger une image en niveaux de gris de votre choix


1 def negatif ( a ):
2 n , p = a . shape
3 for i in range ( n ):
4 for j in range ( p ):
5 a [i , j ] = 256 - a [i , j ]

14. Écrire une fonction negatif(M) qui crée le négatif d’une image représentée par une matrice M.

3.4.2 Luminosité d’une image

Pour augmenter (ou diminuer) la luminosité d’une image, il suffit d’augmenter (ou diminuer) la
valeur de tous les pixels de l’image, en ajoutant un nombre entier v positif (ou négatif) à chaque
pixel. Attention toutefois à ce que les valeurs des pixels MIJ restent bien comprises entre 0 et 255
:
- Si MIJ + V > 255 alors, MIJ ←− 255 ;
- Si MIJ + V < 0 alors, M IJ ←− 0.

15. Écrire la fonction luminosité (M, v) qui reçoit en paramètre une matrice M qui représente une
image, et un entier v (positif ou négatif). La fonction ajoute le nombre v à chaque pixel de l’image
M.

3.4.3 Histogramme d’une image

L’histogramme représente la distribution dos intensités do l’image. C’est un outil fondamental


du traitement d’images, avec de très nombreuses applications. Los histogrammes sont aussi très
utilisés en photographie et pour la retouche d’images.

Dans une image en niveaux de gris, les valeurs des pixels sont comprises entre 0 et 255. L’histogramme
Programmation Python 4 fouadnafis@gmail.com
Fouad NAFIS Filière : MP
de cette image associe à chaque niveau do gris k le nombre de pixels ayant la même valeur k.

16. Écrire la fonction occurrences (M) qui reçoit on paramètre une matrice M qui représente une
image en niveaux de gris. La fonction retourne une liste C de taille 256 : pour chaque niveau de
gris k, I élément C[k] contient le compte des pixels de l’image M, ayant la même valeur k.

17. Écrire la fonction histogramme (C) qui reçoit en paramètre la liste C des occurrences d’une
image en niveaux de gris. La fonction retourne une liste H de tuples, qui représente l’histogramme
de l’image M : Chaque tuple de H est composé de deux éléments : le premier élément est la valeur
d’un niveau de gris k qui existe dans l’image M, le second élément est le compte des pixels de M
ayant la même valeur k.

3.4.4 Créer une nouvelle image couleur

Si l’image est en couleur, le tableau contient des triplets d’entiers, chacun représentant l’intensité
en rouge (R), vert (G) et bleu (B).

18. Tester avec un tableau aléatoire.

19. Mettre à 0 les composantes verte et bleue dans l’image de départ.

20. Extraire les images (niveau de gris) représentant les composantes rouge, verte et bleue.

21. Charger le fichier ”pandas.jpg” ou autre image de votre choix

22. Adapter quelques unes des fonctions de la partie précédente au cas d’une image couleur.

23. Passer l’image en niveaux de gris.

4 Le module PIL
Question
Combien de couleurs différentes est-il possible de créer avec le système RVB ?

4.1 Créer une image de couleurs quelconques


1 from PIL import Image
2 from random import randint
3 im1 = Image . new ( ’ RGB ’ ,(500 ,200) ,(0 ,0 ,255)) # ’L ’ au lieu de ’ RGB ’ pour le niv
4 for x in range (0 ,500*500) :
5 a ,b , c = randint (0 ,255) , randint (0 ,255) , randint (0 ,255)
6 im1 . putpixel (( randint (0 ,499) , randint (0 ,199)) ,( a ,b , c ))
7 im1 . show ()

Afficher le tableau associée à une image existante


1 from PIL import Image
2 im = Image . open ( " D :\\ image . jpg " )
3 tab = np . array ( im )
4 print ( tab )

Programmation Python 5 fouadnafis@gmail.com


Fouad NAFIS Filière : MP
4.2 Afficher les informations sur une image
1 print ( im . size ) # im . size renvoie la taille de l ’ image ( largeur x hauteur )
2 print ( len ( tab )) # nb de sous - tableaux de tab ( nombre de lignes sur l ’ image )
3 print ( len ( tab [0])) # nb de sous - sous - tableaux de tab ( nombre de colonnes )
4 print ( len ( tab [0][0])) # nb de couleurs additives utilis é es : R , V et B
5 print ( tab . shape ) # renvoie un tuple des é l é ments pr é c é dents (h , l , 3)

4.3 Changer le format d’une image


1 image2 = Image . fromarray ( tab )
2 image2 . show () # pour afficher l ’ image
3 image2 . save ( " d :\\ image2 . png " ) # pour l ’ enregistrer au format voulu

4.4 Composantes d’une image en couleurs


1 from PIL import Image
2 img = Image . open ( " pomme . jpg " )
3 largeur_image =500
4 hauteur_image =500
5 for y in range ( hauteur_image ) :
6 for x in range ( largeur_image ) :
7 r ,v , b = img . getpixel (( x , y ))
8 print ( " rouge : " ,r , " vert : " ,v , " bleu : " ,b )

4.5 Afficher un teinte (Rouge, vert, bleu


Écrire un programme qui permette de mettre un filtre ”rouge” sur une image, c’est-à-dire qui n’affiche
que les teintes rouges de l’image, puis le tester. Faire ensuite un filtre bleu, puis un filtre vert
1 from PIL import Image
2 img = Image . open ( " D :\\ pandas . jpg " )
3 m = img . size [0]
4 n = img . size [1]
5 for y in range ( m ) :
6 for x in range ( n ) :
7 r ,v , b = img . getpixel (( x , y ))
8 n_r =0
9 n_v = v
10 n_b =0
11 img . putpixel (( x , y ) ,( n_r , n_v , n_b ))
12 img . show ()

4.6 Conversion d’une image couleur en image en niveau de gris


1 from PIL import Image
2 img = Image . open ( " D :\\ pandas . jpg " )
3 largeur_image = img . size [0]
4 hauteur_image = img . size [1]
Programmation Python 6 fouadnafis@gmail.com
Fouad NAFIS Filière : MP
5 for y in range ( hauteur_image ) :
6 for x in range ( largeur_image ) :
7 r ,v , b = img . getpixel (( x , y ))
8 k =( r + v + b )//3
9 img . putpixel (( x , y ) ,(k ,k , k ))
10 img . show ()

4.7 Négatif d’une image


1 from PIL import Image
2 img = Image . open ( " D :\\ pandas . jpg " )
3 largeur_image = img . size [0]
4 hauteur_image = img . size [1]
5 for y in range ( hauteur_image ) :
6 for x in range ( largeur_image ) :
7 r ,v , b = img . getpixel (( x , y ))
8 k =( r + v + b )//3
9 img . putpixel (( x , y ) ,(255 - r ,255 - v ,255 - b ))
10 img . show ()

4.8 Histogramme d’une image


1 from PIL import Image
2 import matplotlib . pyplot as plt
3 img = Image . open ( " D :\\ pandas . jpg " )
4 r , g , b = img . split ()
5 x = list ( range (256))
6 plt . plot (x , r . histogram () , ’r -. ’)
7 plt . plot (x , g . histogram () , ’v -. ’)
8 plt . plot (x , b . histogram () , ’b -. ’)
9 plt . show ()

4.9 Flouter une image


1 from PIL import Image , ImageFilter
2 import matplotlib . pyplot as plt
3 img = Image . open ( " D :\\ pandas . jpg " )
4 img = img . filter ( ImageFilter . BLUR )
5 plt . imshow ( img , cmap = ’ gray ’)
6 plt . show ()

4.10 Seuillage fixe


Le seuillage est une opération qui affecte la valeur 0 à tous les pixels dont le niveau est inférieur à celui
du seuil. L’objectif du seuillage et de convertir une image en noir et blanc
1 from PIL import Image , ImageFilter
2 import matplotlib . pyplot as plt
3 img = Image . open ( " D :\\ pandas . jpg " )
Programmation Python 7 fouadnafis@gmail.com
Fouad NAFIS Filière : MP
4 seuil =100
5 n = img . size [0]
6 m = img . size [1]
7 for i in range ( n ):
8 for j in range ( m ):
9 r ,g , b = img . getpixel (( i , j ))
10 if r > seuil or g > seuil or b > seuil :
11 img . putpixel (( i , j ) ,(255 ,255 ,255))
12 else :
13 img . putpixel (( i , j ) ,(0 ,0 ,0))
14 plt . imshow ( img )
15 plt . show ()

4.11 Détection de contour


Un contour est un changement brusque d’intensité de lumière ou de couleur des pixels adjacents. Il
existe plusieurs méthode pour détecter de contour :
- Filtre de gradient
- Filtre de Sobel
- Filtre de Canny
1 from PIL import Image , ImageFilter
2 import matplotlib . pyplot as plt
3 img = Image . open ( " D :\\ pandas . jpg " )
4 img = img . convert ( ’L ’)
5 img = img . filter ( ImageFilter . FIND_EDGES )
6 plt . imshow ( img , cmap = ’ gray ’)
7 plt . show ()

Programmation Python 8 fouadnafis@gmail.com

Vous aimerez peut-être aussi