Programmer un algorithme d’extraction de contours par comparaison entre pixels

Quand une voiture autonome est en mouvement, il est important qu'elle sache reconnaître les objets qui l’entourent : véhicules, piétons, cyclistes, les panneaux de signalisation. Pour suivre la route, elle doit savoir en particulier reconnaître les bordures, les lignes blanches, les trottoirs, etc.

Pour cela, les photos réalisées par ses capteurs sont traitées par des algorithmes qui permettent de détecter les contours des objets qu’elle rencontre. L’objectif de cette activité est de découvrir le fonctionnement d’un de ces algorithmes de détection de contours.

Qu'est-ce qu'un contour ?

  1. Repérer et sélectionner les pixels appartenant au contour de la ligne blanche sur l’agrandissement de l’image en niveaux de gris ci-contre.
  2. Proposer une méthode permettant de déterminer si un pixel appartient à un contour.

Pixels voisins

Pour repérer la position d’un pixel, on repère d’abord la colonne x à laquelle il appartient, puis la ligne y. Notons un tel pixel P(x, y) et NG(x, y)son niveau de gris.

Pour détecter si le pixel P(x, y) appartient ou non à un contour, la méthode consiste à chercher une rupture d’intensité entre 2 pixels symétriques par rapport à P(x, y), appelés pixel voisins. Pour cela on calcule la différenceentre les niveaux de gris de 2 pixels voisins. Si cette différence est assez élevée, le pixel fait parti du contour.

Attention : En python le premier pixel en haut à gauche a pour coordonnées (0, 0) et non (1, 1).

Mesure d’une discontinuité avec 4 pixels voisins

Dans l'exemple précédent, seul un couple de pixels voisins est pris en compte dans une unique direction. Pour détecter des contours sur deux directions différentes, il faut prendre en compte deux couples de pixels voisins (voir schéma). Pour cela, il faut calculer pour chacun la différence des niveaux de gris et afin de pouvoir les ajouter sans que les différences s'annulent du fait des valeurs négatives, il faudra élever leur valeur au carré.

Programmation de la détection de contours dans une image

Programmation de la détection de contours dans une image

L'algorithme permettant d’afficher les contours des objets sur une image a été partiellement programmé en python dans l'éditeur ci-dessous.

Description des lignes du programme :

  • Ligne 3 : Définition d'une fonction avec le mot clé def. Cette fonction aura besoin d'un argument filename qui correspond au nom du fichier à charger pour ouvrir l'image. Toutes les lignes indentées (décallées par rapport à la marge) sont contenues dans la fonction. Il s'agit des lignes 4 à 18.
  • Ligne 5 : Permet de créer une image vide nommée im_contour ayant les mêmes caractéristiques (niveaux de gris et taille) que l'image im.
  • Lignes 14 à 17 : Test permettant de compléter l'image vide im_contour avec un pixel noir s'il s'agit d'un pixel de contour ou un pixel blanc dans le cas contraire.
  • Ligne 18 : Le mot clé return permet de définir ce que va retourner la fonction comme résultat. Il s'agit de la dernière ligne de la fonction contour. Ici, ce qui est renvoyé est l'image dans laquelle a été tracé les contours : im_contour.
  • Ligne 20 : Une fois que la fonction a été créée, elle n'est pas exécutée. Pour qu'elle s'applique réellement, il faut l'invoquer en lui donnant tous les arguments nécessaire. C'est ce que réalise cette ligne 20. Le résultat de la fonction est affecté à la variable im.


À vous de jouer :

  1. Après s'être approprier le code, compléter la ligne 13 et la ligne 15 afin de réaliser le bon calcul à partir des valeurs en niveaux de gris des pixels voisins.
  2. Modifier le code pour effectuer le même traitement sur la deuxième image disponibles.

Remarque : Il est possible de visualiser les images disponibles et le résultat en cliquant sur l'icône "Files" située en haut à gauche de l'éditeur ci-dessous.

contours photofiltre matrice peronnalisable.jpg