Compter des objets dans une image
Compter des objets dans une image revient à étiqueter les régions connexes d’un masque : chaque groupe de pixels blancs qui se touchent reçoit un numéro.
C’est ainsi qu’un programme compte des pièces sur une table ou des cellules sous un microscope. Une seconde méthode, la correspondance de modèle, retrouve la position d’un petit motif.
À la fin de cette leçon
Remarque
Je peux compter les objets d’une image et retrouver la position d’un motif.
Mots clés
| Mot | Ce que ça veut dire |
|---|---|
| Région connexe | un groupe de pixels blancs qui se touchent |
| Voisinage | les pixels qui comptent comme « touchant » un pixel |
| Étiquetage | donner un numéro à chaque région |
| Aire | le nombre de pixels d’une région |
| Motif | un petit morceau d’image que l’on cherche |
| Correspondance de modèle | la recherche d’un motif en le glissant sur l’image |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Des pixels qui se touchent forment une région
Après un seuil, l’image est un masque : des pixels blancs sur fond noir. Deux pixels blancs qui se touchent appartiennent au même objet.
Une région connexe est un groupe de pixels blancs reliés de proche en proche. L’étiquetage donne à chaque région son numéro : 1, 2, 3. Le plus grand numéro est alors le nombre d’objets.
Compter les pièces avec count.py
docker exec jupyter python3 steps/count.pyAffiché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.
Le voisinage décide quels pixels se touchent
Deux pixels en diagonale se touchent-ils ? Cela dépend du voisinage. Avec le voisinage de 4, seuls le haut, le bas, la gauche et la droite comptent. Avec le voisinage de 8, les diagonales comptent aussi.
Scikit-image étiquette par défaut avec le voisinage de 8. Pour le voisinage de 4, il faut écrire connectivity=1. Le devoir de cette leçon utilise le voisinage de 4.
Exemple travaillé : une diagonale, deux réponses
| Masque | Voisinage de 8 | Voisinage de 4 |
|---|---|---|
| 1 0 / 0 1 (deux pixels en diagonale) | 1 région | 2 régions |
| 1 1 0 0 / 0 0 0 1 / 1 0 0 1 | 3 régions | 3 régions |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une diagonale compte une ou deux régions
docker exec jupyter python3 -c "import numpy as np; from skimage import measure; g=np.array([[1, 0], [0, 1]]); print(measure.label(g).max(), measure.label(g, connectivity=1).max())"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.
Compter les voisins blancs d’un pixel
# Combien de voisins blancs a un pixel ? On regarde haut, bas, gauche, droite.
masque = [
[0, 1, 0],
[1, 1, 1],
[0, 0, 1],
]
ligne = 1
colonne = 1
compte = 0
if masque[ligne - 1][colonne] == 1:
compte = compte + 1
if masque[ligne + 1][colonne] == 1:
compte = compte + 1
if masque[ligne][colonne - 1] == 1:
compte = compte + 1
if masque[ligne][colonne + 1] == 1:
compte = compte + 1
print("voisins blancs :", compte)
# Remplacez le 0 du milieu de la dernière ligne par 1, puis relancez.
# Combien de voisins blancs a maintenant le pixel du centre ?
Une erreur fréquente
Attention
Beaucoup pensent que le nombre de régions est le nombre d’objets. Deux pièces qui se touchent forment une seule région, et un point de bruit en forme une de plus. Comptez sur un masque propre, et vérifiez l’aire de chaque région.
La correspondance de modèle retrouve un motif
Parfois on connaît l’objet et on cherche où il est. On découpe un petit motif de l’image, puis on le glisse sur toute l’image en notant à chaque position un score de ressemblance.
Le meilleur score donne la position. Un score de 1 veut dire des pixels identiques. Le script find.py découpe un carré de 40 sur 40 dans les pièces et le cherche.
Retrouver un motif avec find.py
docker exec jupyter python3 steps/find.pyAffiché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, refaites le comptage des pièces avec connectivity=1, puis écrivez le nombre trouvé. Changez ensuite le seuil de 100 en 30, puis en 160.
Combien de régions trouvez-vous avec chacun ? Dites en une phrase pourquoi un seuil mal choisi change le comptage.