Canny Edge Detection
La détection des contours de Canny est un algorithme en plusieurs étapes qui réduit le bruit, détecte les changements brusques de luminosité et crée des cartes de contours fines pour la vision par ordinateur.
La détection des contours de Canny est un algorithme de traitement d’image en plusieurs étapes qui repère les changements brusques de luminosité et les convertit en une carte de contours binaire et fine. Il réduit le bruit, repère les transitions d’intensité et relie les pixels de contour fiables pour former des contours continus. En vision par ordinateur, ces contours décrivent la structure de l’image pour l’analyse des formes et la mesure.
John Canny a mis au point cette méthode en 1983 et l’a présentée dans son article de 1986, A Computational Approach to Edge Detection. Sa conception vise trois objectifs : détecter les vrais contours, les localiser avec précision et produire une seule réponse par contour. « Détecteur de contours de Canny » est un synonyme de l’algorithme.
Fonctionnement de la détection des contours de Canny#
L’algorithme associe le prétraitement des données au filtrage et à l’analyse de connectivité. Ses cinq étapes ont chacune un rôle distinct :
- Réduction du bruit : le lissage gaussien calcule la moyenne des pixels voisins avec des poids qui varient selon la distance, supprimant les fluctuations susceptibles de créer des contours indésirables.
- Estimation du gradient : les dérivées horizontales et verticales mesurent la vitesse à laquelle la luminosité change. Leur combinaison donne la force du contour et une direction perpendiculaire à sa limite. OpenCV utilise les dérivées de Sobel lors de cette étape.
- Amincissement des contours : la suppression des non-maxima conserve les pics locaux du gradient dans la direction de celui-ci, produisant des crêtes étroites plutôt que de larges bandes.
- Double seuillage : un seuil élevé repère les contours forts ; un seuil faible élimine les réponses faibles. Les pixels situés entre les deux seuils deviennent des candidats.
- Liaison par hystérésis : les pixels candidats sont conservés lorsqu’ils sont reliés à un contour fort par d’autres candidats. Les candidats isolés disparaissent.
Seuils, lissage et modes d’échec#
Les seuils s’appliquent à l’intensité du gradient plutôt qu’à la luminosité brute ou à la confiance du modèle. Les diminuer conserve davantage de détails et de bruit ; les augmenter supprime les contours faibles. Augmenter le seuil élevé réduit également le nombre de pixels de contour forts disponibles pour le chaînage par hystérésis.
L’échelle gaussienne contrôle un compromis distinct. Un lissage plus important atténue le bruit, mais supprime les structures fines. Dans l’exemple du carré bruité de scikit-image, modifier l’écart type gaussien change la quantité de bruit qui subsiste autour du carré.
Lors de l’inspection des fissures, les surfaces de béton rugueuses produisent des contours de texture indésirables et des contours de fissures incomplets. Augmenter les seuils supprime certains faux contours, mais fait aussi disparaître des sections de fissures réelles.
Sobel estime les dérivées de l’intensité ; Canny combine l’estimation du gradient avec le lissage, l’amincissement et une sélection fondée sur la connectivité. L’étape d’amincissement de Canny compare les pixels voisins, tandis que la NMS de détection d’objets compare les boîtes prédites qui se chevauchent.
Détection des contours avec Canny en Python#
Installe les dépendances avec pip install opencv-python numpy. Cet exemple utilise OpenCV pour enregistrer une carte de contours de l’échantillon du bus :
from urllib.request import urlopen
import cv2
import numpy as np
with urlopen("https://ultralytics.com/images/bus.jpg") as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
gray = cv2.imdecode(encoded, cv2.IMREAD_GRAYSCALE)
# Lisse l’image avant de calculer les gradients d’intensité.
smoothed = cv2.GaussianBlur(gray, (5, 5), 1.4)
edges = cv2.Canny(smoothed, 50, 150, L2gradient=True)
cv2.imwrite("canny_edges.png", edges)Le fichier PNG enregistré montre les contours conservés en blanc sur fond noir. Dans le flux de détection des contours d’OpenCV, les deuxième et troisième arguments de Canny définissent les seuils bas et haut. L2gradient=True utilise la norme euclidienne du gradient ; le comportement par défaut utilise la somme des dérivées horizontale et verticale en valeur absolue. Ces choix modifient les valeurs du gradient et, par conséquent, le comportement des seuils.
Applications et tâches de vision associées#
Canny prend en charge l’extraction de caractéristiques géométriques : l’exemple de détection de lignes de scikit-image l’applique à une photographie de cameraman avant qu’une transformée de Hough probabiliste n’extraie des segments droits. Canny fournit les pixels de contour ; le vote de Hough les regroupe en lignes. La détection d’objets attribue des catégories et des boîtes, tandis que la segmentation d’instances attribue les pixels à des objets individuels.
La segmentation YOLO26 d’Ultralytics renvoie des masques pour l’isolation d’objets, qui permettent de sélectionner des régions de l’image pour un traitement Canny distinct. Cette approche combine la sélection d’objets apprise avec l’extraction classique des contours.
En IA générative, ControlNet utilise des cartes Canny comme conditions spatiales pour les modèles de diffusion. Son implémentation conditionnée par Canny guide la génération avec Stable Diffusion 1.5 en utilisant les contours extraits en complément d’une invite textuelle.










