Détection de bords d'image avec OpenCV

La détection de contours d'image est une tâche fondamentale en vision par ordinateur et en traitement d'image. Elle est utilisée pour identifier les régions d'une image où la luminosité change de manière significative, et ces régions correspondent généralement aux limites des objets.

Voici les fonctions de détection de contours couramment utilisées dans OpenCV et leurs descriptions :

FonctionAlgorithmeDescriptionScénarios applicables
cv2.Canny()Détection de contours de CannyAlgorithme multi-étapes, bonnes performances de détection, forte capacité de suppression du bruit.Détection de contours polyvalente, adaptée à la plupart des scénarios.
cv2.Sobel()Opérateur SobelDétection de contours basée sur les dérivées du premier ordre, peut détecter les contours horizontaux et verticaux.Détecter les contours horizontaux et verticaux.
cv2.Scharr()Opérateur ScharrUne version améliorée de l'opérateur de Sobel, avec une réponse plus forte aux contours.Détecter les contours subtils.
cv2.Laplacian()Opérateur LaplacienDétection de contours basée sur les dérivées du second ordre, sensible au bruit.Détecter les contours et les coins.

1. Détection de contours Canny (cv2.Canny())

La détection de contours Canny est un algorithme de détection de contours multi-étapes proposé par John F. Canny en 1986.

La détection de contours Canny est considérée comme la référence absolue de la détection de contours car elle offre un bon équilibre entre la suppression du bruit et la localisation des contours.

1.1 Étapes de la détection de contours Canny

L'algorithme de détection de contours de Canny comprend principalement les étapes suivantes :

  1. Suppression du bruit: Utilisez un filtre gaussien pour lisser l'image afin de réduire l'impact du bruit.
  2. Calcul du gradient: Utilisez l'opérateur Sobel pour calculer l'amplitude et la direction du gradient de l'image.
  3. Suppression des non-maxima: Le long de la direction du gradient, conservez les pixels ayant le gradient local maximal et supprimez les autres pixels.
  4. Détection par double seuil: Utilisez deux seuils (bas et haut) pour déterminer les contours réels. Les pixels au-dessus du seuil haut sont considérés comme des contours forts, les pixels en dessous du seuil bas sont supprimés, et les pixels situés entre les deux sont conservés s'ils sont connectés à des contours forts.
  5. Connexion des contours: Grâce au seuillage par hystérésis, les contours faibles sont connectés aux contours forts pour former des contours complets.

1.2 Implémentation de la détection de contours de Canny avec OpenCV

Dans OpenCV, vous pouvez utiliser lacv2.Canny()fonction pour implémenter la détection de contours de Canny.

Le prototype de cette fonction est le suivant :

edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)
  • image: Image d'entrée, doit être une image en niveaux de gris à un seul canal.
  • threshold1: Seuil bas.
  • threshold2: Seuil haut.
  • apertureSize: Taille d'ouverture de l'opérateur Sobel, la valeur par défaut est 3.
  • L2gradient: Indique s'il faut utiliser la norme L2 pour calculer l'amplitude du gradient, la valeur par défaut est False (utilise la norme L1).

Exemple

import cv2
import numpy as np

# Lire l'image
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# Appliquer la détection de contours Canny
edges = cv2.Canny(image, 100, 200)

# Afficher le résultat
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. Opérateur Sobel (cv2.Sobel())

L'opérateur Sobel est un opérateur de détection de contours basé sur le gradient qui détecte les contours en calculant les gradients de l'image dans les directions horizontale et verticale.

L'opérateur Sobel combine un lissage gaussien et une différenciation, il a donc un certain effet de suppression du bruit.

2.1 Principe de l'opérateur Sobel

L'opérateur Sobel utilise deux noyaux de convolution 3x3 pour calculer respectivement les gradients de l'image dans les directions horizontale et verticale :

  • Noyau de convolution horizontal :
    [-1, 0, 1]
    [-2, 0, 2]
    [-1, 0, 1]
    
  • Noyau de convolution vertical :
    [-1, -2, -1]
    [ 0,  0,  0]
    [ 1,  2,  1]
    

Grâce à ces deux noyaux de convolution, les gradients de l'image dans les directions horizontale et verticale peuvent être obtenus, respectivementGxetGy. La magnitude finale du gradient peut être calculée à l'aide de la formule suivante :

G = sqrt(Gx^2 + Gy^2)

2.2 Implémentation de l'opérateur de Sobel avec OpenCV

Dans OpenCV, vous pouvez utiliser lacv2.Sobel()fonction pour calculer le gradient d'une image. Le prototype de cette fonction est le suivant :

dst = cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
  • src: Image d'entrée.
  • ddepth: Profondeur de l'image de sortie, utilisez généralementcv2.CV_64F。
  • dx: Ordre de la dérivée dans la direction x.
  • dy: Ordre de la dérivée dans la direction y.
  • ksize: Taille du noyau de Sobel, par défaut 3.
  • scale: Facteur d'échelle, par défaut 1.
  • delta: Valeur delta facultative, par défaut 0.
  • borderType: Type d'extension de bordure, la valeur par défaut estcv2.BORDER_DEFAULT。

Exemple

import cv2
import numpy as np

# Lire l'image
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# Calculer le gradient dans la direction x
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)

# Calculer le gradient dans la direction y
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

# Calculer la magnitude du gradient
sobel_combined = np.sqrt(sobel_x**2 + sobel_y**2)

# Afficher le résultat
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. Opérateur laplacien (cv2.Laplacian())

L'opérateur laplacien est un opérateur différentiel du second ordre qui détecte les contours en calculant la dérivée seconde de l'image. L'opérateur laplacien est relativement sensible au bruit, c'est pourquoi l'image est généralement lissée avec un filtre gaussien avant utilisation.

3.1 Principe de l'opérateur laplacien

L'opérateur laplacien utilise le noyau de convolution suivant pour calculer la dérivée seconde de l'image :

[ 0,  1,  0]
[ 1, -4,  1]
[ 0,  1,  0]

Avec ce noyau de convolution, la valeur du laplacien de l'image peut être obtenue. Les régions avec des valeurs de laplacien plus grandes correspondent généralement aux contours de l'image.

3.2 Implémentation de l'opérateur laplacien avec OpenCV

Dans OpenCV, vous pouvez utiliser lacv2.Laplacian()fonction pour calculer la valeur du laplacien d'une image.

Le prototype de cette fonction est le suivant :

dst = cv2.Laplacian(src, ddepth, ksize=1, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
  • src: Image d'entrée.
  • ddepth: Profondeur de l'image de sortie, utilisez généralementcv2.CV_64F。
  • ksize: Taille du noyau laplacien, la valeur par défaut est 1.
  • scale: Facteur d'échelle, par défaut 1.
  • delta: Valeur delta facultative, par défaut 0.
  • borderType: Type d'extension de bordure, la valeur par défaut estcv2.BORDER_DEFAULT。

Exemple

import cv2
import numpy as np

# Lire l'image
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# Appliquer l'opérateur laplacien
laplacian = cv2.Laplacian(image, cv2.CV_64F)

# Afficher le résultat
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

Comparaison des fonctions courantes de détection de contours

Ce qui suit est une comparaison des fonctions courantes de détection de contours dans OpenCV :

FonctionAlgorithmeAvantagesInconvénientsScénarios applicables
cv2.Canny()Détection de contours de CannyForte suppression du bruit, bonnes performances de détection des contours.Le réglage des paramètres est relativement complexe.Détection de contours polyvalente, adaptée à la plupart des scénarios.
cv2.Sobel()Opérateur SobelCalcul simple, adapté à la détection des contours horizontaux et verticaux.Sensible au bruit, performances moyennes de détection des contours.Détecter les contours horizontaux et verticaux.
cv2.Scharr()Opérateur ScharrRéponse plus forte aux contours, adapté à la détection des contours subtils.Sensible au bruit.Détecter les contours subtils.
cv2.Laplacian()Opérateur LaplacienPeut détecter les contours et les coins.Très sensible au bruit.Détecter les contours et les coins.
Autres extensions