Traitement d'image, filtres de Sobel⚓︎
1. Description⚓︎
On ne travaille que sur des images en nuances de gris.
Le filtre de Sobel est un filtre de détection de contour qui fait appel à des opérations de convolution entre le voisinage carré \(3 \times 3\) d'un pixel de coordonnées \((x,y)\) et deux matrices de coefficients de mêmes dimensions.
On calcule ainsi une approximation du gradient de l'intensité du pixel, équivalent de la dérivée dans un espace à deux dimensions. Ce gradient mesure donc la variation d'intensité au voisinage du pixel et il est d'autant plus grand et proche de 255 (blanc) si le pixel est sur un contour.
Voici un exemple :
Original
Contour Sobel
1.1 Prérequis : représentation d'une image⚓︎
Une image sera représentée par une liste de listes (pour une image de 640 pixels de large par 480 pixels de hauteur, ce sera une liste de 480 listes de taille 640).
Chaque élément de cette liste de listes correspond à un pixel de cette image. Si c'est une image en couleur (RGB), chaque pixel est représenté par un tuple d'entiers entre 0 et 255 (exemple: (48, 52, 203) signifie que c'est un pixel comportant 48/255 rouge, 52/255 vert et 203/255 bleu). Si c'est une image en niveau de gris (L), chaque pixel est représenté par un entier entre 0 et 255.
L'utilisation de la bibliothèque PIL permet de charger une image est de la mettre sous la forme présentée ci-dessus.
Utilisation de Pillow
from PIL import Image
im = Image.open("image_exemple.png") # ouverture du fichier image "image_exemple.png" qui doit être dans le même dossier
pixels = im.getdata()
width, height = im.size
pix_image = [[pixels[i * width + j] for j in range(width)] for i in range(height)] # Permet de créer une liste de listes comme voulu
Installation de Pillow
Dans un terminal
C:\chemin\vers\python\python.exe -m pip install Pillow
Le chemin vers python est à trouver en éxécutant un fichier python dans Visual Studio Code. Il suffit ensuite de se mettre dans le terminal, de faire flèche du haut pour retrouver la dernière éxécution et supprimer la partie qui ne nous intéresse pas.
1.2 Prérequis : convolution⚓︎
Avec les notations du schéma ci-dessus le produit de convolution de la matrice de coefficients à gauche par le voisinage du pixel à droite s'obtient comme une somme des produits de coefficients par les pixels en même position. On note \(\text{pix}[y][x]\) le pixel d'abscisse \(x\) et d'ordonnée \(y\).
\(a \times \text{pix}[y-1][x-1] + b \times \text{pix}[y-1][x] + c \times \text{pix}[y-1][x+1]\) \(\qquad + d \times \text{pix}[y][x-1] + e \times \text{pix}[y][x] + f \times \text{pix}[y][x+1]\) \(\qquad \qquad + g \times \text{pix}[y+1][x-1] + h \times \text{pix}[y+1][x] + i \times \text{pix}[y+1][x+1]\)
Par exemple le produit de convolution de la matrice de coefficients \(A=\begin{pmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{pmatrix}\) par le voisinage de pixels \(B=\begin{pmatrix} 50 & 10 & 80 \\ 60 & 40 & 20 \\ 70 & 30 & 90 \end{pmatrix}\) est \(1 \times 50 + 2 \times 10 + 1 \times 80 + 2 \times 60 + 4 \times 40 + 2 \times 20 + 1 \times 70 + 2 \times 30 + 1 \times 90\).
1.3 Etapes de l'application du filtre de Sobel⚓︎
Pour appliquer le filtre de Sobel les étapes sont les suivantes :
-
Pour chaque pixel de l'image de coordonnées \((x,y)\), :
-
calculer le produit de convolution de son voisinage carré \(3 \times 3\) par la matrices \(C=\begin{pmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{pmatrix}\) pour la variation d'intensité horizontale. On note le résultat \(p_{h}\).
-
calculer le produit de convolution de son voisinage carré \(3 \times 3\) par la matrices \(D=\begin{pmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{pmatrix}\) pour la variation d'intensité verticale. On note le résultat \(p_{v}\).
-
calculer la norme euclidienne \(\sqrt{p_{h}^{2}+p_{v}^{2}}\).
-
normaliser pour avoir une valeur entière entière entre 0 et 255, en prenant sa partie entière et en minorant par 255 si elle excède 255.
-
-
Exporter cette nouvelle image.
2. Objectifs⚓︎
Primaire : créer les fonctions permettant de créer une image des contours à partir d'une image.
Secondaire :
- Créer une interface permettant d'utiliser cet outil (en ligne de commande (facile), avec une interface graphique davistk (moyen), dans une appli web flask (difficile))
- Proposer d'autre types de filtres
3. Calendrier et contenu des rendus⚓︎
Date 1⚓︎
- Description des structures de données (que doit-on représenter ? et comment va-t-on les représenter ?)
- Liste des fonctions à créer avec leur description (docstring) et leurs tests (doctests)
Date 2⚓︎
- Projet final et fonctionnel
- Rapport de projet
- Capsules audio
4. Quelques ressources⚓︎
-
Traitement d'images : Pillow https://pillow.readthedocs.io/en/stable/
-
Interface en ligne de commande : utilisation de sys.argv