5.8. Remplissage par diffusion et glyphes de détection

Les primitives géométriques du début de cette section placent des marques à des positions que l’application connaît déjà. La composition d’images dépose une image sur une autre. Un dernier petit groupe de méthodes de dessin fait quelque chose de différent : il place des marques dont la forme dépend de ce qui est déjà dans l’image, ou de ce qu’un algorithme précédent y a trouvé.

5.8.1. Remplissage par diffusion

flood_fill() part d’un unique pixel – le germe – et croît vers l’extérieur, peignant chaque pixel suffisamment similaire au germe et qui lui est connecté par une chaîne d’autres pixels similaires. Le résultat est une région remplie dont la frontière est décidée par l’image elle-même, et non par quoi que ce soit passé à l’appel.

La forme la plus simple prend la coordonnée du germe et une couleur de remplissage :

img.flood_fill(x=160, y=120, color=(0, 255, 0))

Deux paramètres de seuil contrôlent l’agressivité de la croissance du remplissage. seed_threshold (une fraction normalisée de 0.0 à 1.0) définit à quel point un pixel peut différer de la valeur du germe d’origine tout en restant inclus. floating_threshold définit à quel point il peut différer de chaque voisin déjà inclus. Les deux seuils fonctionnent de concert : un floating_threshold généreux permet au remplissage de suivre un dégradé à travers l’image, tandis qu’un seed_threshold strict l’empêche de trop s’éloigner de la valeur du germe, même le long de ce dégradé.

Quelques indicateurs affinent davantage le résultat :

  • invert=True peint chaque pixel qui ne correspond pas – le complément de la région correspondante – plutôt que les pixels correspondants eux-mêmes.

  • clear_background=True met à zéro chaque pixel en dehors de la région de remplissage. Utile pour extraire uniquement la région remplie sous forme de masque.

  • Le mot-clé mask a son sens habituel : les pixels désactivés dans le masque sont laissés intacts, que le remplissage les aurait sinon atteints ou non.

Le remplissage par diffusion est surtout utile pour deux schémas. Le premier consiste à visualiser ce qu’un détecteur de régions a trouvé, en remplissant la région détectée d’une couleur distincte afin qu’elle ressorte du reste de la trame. Le second consiste à extraire la région elle-même, en combinant clear_background=True avec un germe connu à l’intérieur de la région et en lisant l’image résultante comme un masque pour des opérations ultérieures.

5.8.2. Dessin des résultats de détection

Les algorithmes de traitement d’image renvoient souvent des objets résultats qui portent à la fois une position et une structure supplémentaire : un point clé avec une orientation, une détection de visage avec un centroïde distinct de sa boîte englobante, un AprilTag avec quatre coins. Bien les dessiner – avec un glyphe qui capture la structure, et pas seulement une boîte englobante – est un schéma suffisamment récurrent pour que le module expose deux assistants à cet effet.

draw_keypoints() prend soit un descripteur de point clé renvoyé par un extracteur de caractéristiques, soit une simple liste de triplets (x, y, rotation), et dessine un petit glyphe à chaque point. Le glyphe porte à la fois la position et l’orientation : un cercle autour du point plus une ligne partant du centre indiquant la rotation. Cette visualisation en un seul appel est le moyen le plus simple de vérifier qu’un extracteur de points clés renvoie bien les orientations attendues par l’application.

draw_detection() prend un sextuplet (rx, ry, rw, rh, cx, cy) – le rectangle englobant plus un centroïde rapporté séparément – et dessine les deux à la fois : un rectangle autour de la boîte englobante, une croix au centroïde et, optionnellement, une étiquette de texte au coin du rectangle. La forme correspond à ce que rapportent typiquement une détection par réseau de neurones ou un suivi par modèle, où le centroïde est une position plus précise que ne le donnerait le centre de la boîte englobante.

Les deux méthodes de glyphe sont des couches de commodité par-dessus les primitives géométriques du début de cette section. Une application peut toujours reproduire la même visualisation en appelant directement draw_rectangle(), draw_circle(), draw_cross() et draw_string() ; les méthodes de glyphe se contentent d’épargner le travail de comptabilité pour les schémas qui reviennent sans cesse.

Avec les primitives géométriques pour la géométrie connue, la composition d’images pour les superpositions, le remplissage par diffusion pour les régions issues de l’image et les glyphes de détection pour les schémas de visualisation standard, la boîte à outils de dessin est complète. Tout ce dont une application a besoin pour rendre visible la sortie d’un algorithme dispose d’une méthode à sa surface qui l’y place.