Fonction OpenCV sobel()

Manav Narula 8 octobre 2023
  1. Détection des contours à l’aide de la fonction Sobel() à l’aide d’OpenCV en Python
  2. Conclusion
Fonction OpenCV sobel()

En utilisant la bibliothèque OpenCV, nous pouvons traiter et appliquer diverses techniques aux images. Ces processus font partie intégrante des tâches complexes de vision par ordinateur, et l’une de ces tâches est la détection des contours dans les images.

Les bords sont les limites ou les contours des objets dans une image et sont associés à des changements très importants dans la densité des pixels. En comparant la densité des pixels voisins, nous pouvons détecter les bords.

Divers algorithmes sont disponibles pour la détection des bords et sont appliqués dans la bibliothèque OpenCV. L’une de ces techniques est l’algorithme Sobel Edge Detection.

Ce tutoriel démontrera l’algorithme Sobel utilisant OpenCV en Python.

Détection des contours à l’aide de la fonction Sobel() à l’aide d’OpenCV en Python

L’algorithme Sobel Edge Detection utilise le gradient de l’image pour prédire et trouver les bords d’une image. Nous comparons la densité de pixels pour détecter les contours à l’aide de cet algorithme.

Nous calculons la dérivée première de la fonction pour trouver les points de crête. Celles-ci sont ensuite comparées à la valeur seuil.

Dans cette technique, l’opérateur de Sobel calcule le gradient de la fonction. Il combine le lissage gaussien et la différenciation.

En général, on utilise des noyaux pour lisser ou flouter une image, mais dans ce cas, on les utilisera pour calculer les dégradés. Les dérivées sont calculées le long des axes x et y.

Le gradient en un point donné est calculé à l’aide de ces deux valeurs. Cette valeur de gradient est moins sujette au bruit et est ensuite utilisée pour la détection des contours.

La bibliothèque OpenCV implémente cela en utilisant la fonction Sobel(). Nous devons spécifier la fonction avec plusieurs paramètres avec l’image.

Il faut mentionner la profondeur de l’image finale, spécifiée avec le paramètre ddepth. Avec la valeur -1, l’image de sortie aura la même profondeur que l’image d’entrée.

L’ordre des dérivées à utiliser est spécifié à l’aide des paramètres dx et dy. La taille du noyau Sobel étendu est mentionnée à l’aide du paramètre ksize.

Les paramètres échelle et delta sont facultatifs. Voyons maintenant un exemple.

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Production:

Détection des bords à l’aide de Sobel le long des axes X et Y

Dans l’exemple ci-dessus, nous avons utilisé la fonction Sobel(). Nous avons calculé la dérivée du premier ordre le long des axes x et y et obtenu le gradient, qui est ensuite utilisé pour trouver les contours.

L’image finale est de 64 bits, comme spécifié dans le paramètre ddepth. Le noyau utilisé est de taille 5x5.

Notez la fonction GaussianBlur() ; il est utilisé pour flouter une image donnée, et un opérateur Sobel fonctionne mieux sur les images floues. Les fonctions waitKey() et destroyAllWindows() empêchent la fermeture de la fenêtre de sortie et attendent que l’utilisateur appuie sur une touche pour quitter.

Comme indiqué, nous avons calculé la dérivée le long des axes x et y dans l’exemple ci-dessus. Nous pouvons également calculer la dérivée avec l’un ou l’autre axe en mettant la dérivée de l’autre à 0.

Par exemple,

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Production:

Détection des bords à l’aide de Sobel le long de l’axe X

Dans le code ci-dessus, nous calculons la dérivée uniquement le long de la direction horizontale et mettons la valeur du paramètre dy à 0. Pour calculer la dérivée verticalement, nous mettons le paramètre dx à 0.

Notez que dans nos exemples, nous avons utilisé la taille du noyau comme 5x5. Nous pouvons également utiliser la taille 3x3, mais le résultat contient de nombreuses inexactitudes dans ce cas et n’est pas recommandé.

Le filtre Scharr est un autre opérateur similaire à Sobel et peut être utilisé dans les cas 3x3.

Conclusion

Ce tutoriel a démontré l’utilisation de la fonction Sobel() de la bibliothèque OpenCV. Nous avons d’abord commencé par comprendre l’algorithme de Sobel pour la détection des contours.

Nous avons compris les bases des gradients d’image et comment l’opérateur Sobel les calcule efficacement. Des exemples de situations différentes sont présentés dans l’article.

L’inconvénient d’utiliser un noyau 3x3 est également discuté, et son alternative, le filtre Scharr, peut être utilisée pour fournir de meilleurs résultats dans ce cas.

Auteur: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Article connexe - Python OpenCV

Article connexe - OpenCV Image