Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Filtre, noyau et flou d’une image

Après cette leçon: Je peux calmer le bruit d’une image avec un filtre et dire ce que le filtre change.

Leçon de 55 min3 commandesLab de vision par ordinateur : pixels, seuils et comptage d’objets dans JupyterLab

Un filtre calcule un pixel avec ses voisins

Un filtre remplace chaque pixel par un nombre calculé avec les pixels qui l’entourent : le flou le plus simple prend leur moyenne.

Il calme le bruit, ces points parasites d’une page numérisée ou d’une photo prise de nuit, avant toute mesure. Sans lui, un seuil ou un comptage se trompe.

À la fin de cette leçon

Remarque

Je peux calmer le bruit d’une image avec un filtre et dire ce que le filtre change.

Mots clés

MotCe que ça veut dire
Bruitdes variations au hasard qui ne sont pas dans la scène
Filtreune règle qui change chaque pixel selon ses voisins
Noyaula petite grille de poids appliquée à chaque voisinage
Convolutionl’opération qui applique un noyau à toute l’image
Flou moyenun filtre qui remplace un pixel par la moyenne de ses voisins
Filtre médianun filtre qui prend la valeur du milieu des voisins

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un noyau 3 sur 3 pondère les voisins

Pour un pixel donné, on regarde le carré de 3 sur 3 pixels dont il est le centre : lui et ses huit voisins. Un noyau est une grille 3 sur 3 de poids.

On multiplie chaque pixel du carré par le poids qui lui correspond, puis on additionne. Pour le flou moyen, les neuf poids valent 1 et on divise la somme par 9.

Exemple travaillé : un point parasite et la moyenne

Colonne 0Colonne 1Colonne 2
101211
1325512
111013
Somme : 347Moyenne : 347 / 9 = 38,6Arrondi : 39

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Faire la moyenne des neuf pixels

Code: python
# Un morceau de 3 lignes sur 3 colonnes, avec un point parasite au centre.
morceau = [
    [10, 12, 11],
    [13, 255, 12],
    [11, 10, 13],
]
total = 0
for ligne in morceau:
    for valeur in ligne:
        total = total + valeur
print("somme :", total)
print("moyenne :", round(total / 9))
# Remplacez le 255 par 12, puis relancez.
# Que devient la moyenne quand le point parasite disparaît ?

Un flou calme le bruit d’une page numérisée

La page numérisée scan.png est parsemée de points parasites, comme une photocopie sale. Le script blur.py lui applique un flou gaussien, un flou qui donne plus de poids aux voisins proches.

Il mesure ensuite l’écart de valeurs d’un morceau vide de la page, sans écriture : moins il varie, moins il y a de bruit.

Flouter la page avec blur.py

Commande
docker exec jupyter python3 steps/blur.py

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Une erreur fréquente

Attention

Beaucoup pensent qu’un flou ne fait que du bien. Il calme le bruit, mais il adoucit aussi les vrais bords : l’écriture de la page devient plus floue. Plus le noyau est grand, plus le bruit et les détails disparaissent ensemble.

Le filtre médian supprime les points isolés

Le filtre médian prend la valeur du milieu des voisins rangés du plus petit au plus grand. Un point isolé, très clair ou très sombre, finit au bout de la liste et n’est jamais choisi.

Avec 12, 255 et 11, la moyenne vaut 92,7 et la médiane 12. La médiane ignore le point parasite, la moyenne le subit.

Médiane contre moyenne de trois valeurs

Commande
docker exec jupyter python3 -c "import numpy as np; v=[10, 12, 255, 11, 13]; print(np.mean(v[1:4]), np.median(v[1:4]))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Écart du morceau avant et après médian

Commande
docker exec jupyter python3 -c "import numpy as np; from PIL import Image; from scipy import ndimage; s=np.array(Image.open('images/scan.png'))[10:50, 10:90]; print(round(float(s.std()), 1), round(float(ndimage.median_filter(s, size=3).std()), 1))"

Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.

Pour aller plus loin

Dans votre carnet, changez le 2 de GaussianBlur(2) en 5 et mesurez de nouveau l’écart du morceau vide. Puis ouvrez scan_blurred.png.

L’écart baisse-t-il encore ? Et l’écriture reste-t-elle lisible ? Dites en une phrase le prix d’un flou plus fort.

À propos de ce labo et de sa source: Lab de vision par ordinateur : pixels, seuils et comptage d’objets dans JupyterLab

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.