La détection des contours est une technique d'analyse d'images essentielle lorsque quelqu'un est intéressé par la reconnaissance d'objets par leurs contours. Elle est également considérée comme une étape essentielle dans la récupération d'informations à partir d'images..
Par exemple, des caractéristiques importantes telles que des lignes et des courbes peuvent être extraites à l'aide de la détection de contour, qui est ensuite normalement utilisée par des algorithmes de traitement d'images ou de vision par ordinateur de plus haut niveau. Un bon algorithme de détection des contours mettrait en évidence les emplacements des contours principaux dans une image, tout en ignorant les faux contours causés par le bruit.
Mais quels sont les bords quand même? Les bords sont des caractéristiques d'image pouvant être utilisées pour estimer et analyser la structure d'objets dans une image. Ils représentent des changements locaux importants survenus dans l'intensité de l'image (c'est-à-dire la valeur en pixels). Les bords apparaissent normalement à la limite entre deux régions différentes de l'image.
Dans ce tutoriel, je vais décrire l’algorithme du détecteur de bord Canny et la manière de l’implémenter en Python..
L’algorithme du détecteur de bord Canny tire son nom de son inventeur, John F. Canny, qui l’a inventé en 1986. Le détecteur de bord Canny prend normalement une image en niveaux de gris en entrée et produit une image montrant l’emplacement des discontinuités d’intensité (c'est-à-dire des bords)..
Je ne veux pas être mathématique ici, mais je vais décrire ce qui se passe dans les coulisses de l'algorithme du détecteur de bord de Canny d'un point de vue général..
La première chose que fait le détecteur de bord Canny est qu’il utilise la convolution gaussienne pour lisser l’image d’entrée et supprimer le bruit. Un premier opérateur de dérivée est ensuite appliqué à l'image lissée afin de mettre en évidence les régions de l'image avec des premières dérivées spatiales élevées..
L’algorithme trouve alors à la fois l’ampleur et la direction du gradient en calculant la dérivée x et la dérivée y, d’autant plus que la connaissance de la direction du gradient nous permet en fait de trouver la direction des arêtes..
L'algorithme effectue alors ce qu'on appelle suppression non maximale, où il suit le haut des crêtes qui s'élèvent à partir des bords et définit les pixels qui ne sont pas sur le haut de la crête à zéro, produisant ainsi une fine ligne dans le résultat.
En d'autres termes, nous vérifions si le gradient calculé à l'étape précédente est considéré comme le maximum parmi les points voisins se trouvant à la fois dans les directions positive et négative du gradient. Si la pente était maximale, elle est considérée comme faisant partie du bord et inversement.
Le processus de suivi ci-dessus est contrôlé par deux seuils, t1
et t2
, tel que t1> t2
, dénommé seuillage d'hystérésis.Le suivi commence à un point de la crête plus élevé que t1
, et continue ensuite dans les deux directions en dehors de ce point jusqu'à ce que la hauteur de la crête devienne inférieure à t2
.
Donc, fondamentalement, ce qui se passe ici est que nous sélectionnons tous les points de bord qui sont au-dessus du seuil supérieur t1
, et ensuite rechercher s'il y a des voisins de ces points qui sont considérés comme inférieurs au seuil supérieur t1
et au-dessus du seuil inférieur t2
. Dans ce cas, ces voisins feraient partie du bord.
Ainsi, le largeur du noyau gaussien utilisé pour lisser l’image d’entrée, et le t1 (supérieur) et t2 seuils (inférieurs) utilisés par le suivi, sont les paramètres qui déterminent l’effet du détecteur de bord malicieux.
Dans cette section, je décrirai deux manières de mettre en œuvre le détecteur de bord Canny. Une façon utilise le scikit-image
bibliothèque, et l’autre utilise le OpenCV
bibliothèque.
scikit-image
Si vous n'avez pas scikit-image
déjà installé sur votre ordinateur, installez-le en suivant les instructions affichées sur la page d'installation de scikit-image.
Comme j'utilise un Ubuntu
machine, il me fallait simplement exécuter la commande suivante dans mon terminal pour que la bibliothèque soit opérationnelle:
sudo apt-get installez python-skimage
le scikit-image
la bibliothèque a prudent()
fonction que nous pouvons utiliser pour appliquer le détecteur de bord Canny sur notre image. Notez que la fonction fait partie de la fonctionnalité
module.
Avant d’aller de l’avant, utilisons une image de jouet à expérimenter. Vous pouvez utiliser n'importe quelle image. Je vais utiliser l'image boat.png ci-dessous (cliquez sur le lien pour télécharger l'image):
Sans plus tarder, voyons comment détecter les contours de l'image ci-dessus (c'est-à-dire, un bateau) à l'aide du détecteur de contours de Canny. Rappelez-vous que notre image doit être en niveaux de gris. Puisque notre image est déjà en niveaux de gris, nous n’avons rien à faire à ce stade, telle que la conversion de l’image en couleur en niveaux de gris. Le script du détecteur de bord Canny se présente comme suit:
from skimage import io from skimage fonction d'importation im = io.imread ('boat.png') bords = feature.canny (im) io.imshow (bords) io.show ()
Donc, comme vous pouvez le voir, nous avons d'abord lu notre image, boat.png
. Après cela, nous appliquons le prudent()
fonction sur l'image (je n'ai transmis aucun paramètre personnalisé, à l'exception de notre image, et je l'ai laissé aux valeurs par défaut de la fonction). Enfin, nous affichons notre résultat qui montre les arêtes détectées. Le résultat du script ci-dessus se présente comme suit:
Vous pouvez jouer avec les paramètres pour obtenir des résultats différents sur la façon dont les contours sont détectés. Mais le résultat est joli avec ces bords détectés, n'est-ce pas??!
OpenCV
Dans cette section, nous allons voir comment nous pouvons utiliser OpenCV
appliquer le détecteur de bord Canny sur notre image de bateau. Si OpenCV n'est pas encore installé, installez-le. Vous pouvez consulter les articles suivants pour savoir comment installer OpenCV
sur votre machine. J'ai inclus différents articles pour différents systèmes d'exploitation:
Comme avec le scikit-image
bibliothèque, OpenCV
a également une fonction appelée prudent()
appliquer l'algorithme du détecteur de bord de Canny sur l'image. Le script suivant montre comment nous pouvons utiliser OpenCV
pour trouver les bords dans notre image:
import cv2 import matplotlib.pyplot sous la forme plt im = cv2.imread ('boat.png') bords = cv2.Canny (im, 25,255, L2gradient = False) plt.imshow (bords, cmap = 'grey') plt.show ( )
Notez que j’ai passé les arguments suivants comme arguments au Prudent()
une fonction:
je suis
: nom de l'imageseuil inférieur
: 25seuil supérieur
: 255L2gradient = False
: cela signifie que la norme L1 est utilisée. Si réglé à Vrai
, la norme L2 sera utilisée.le matplotlib
Une bibliothèque a ensuite été utilisée pour tracer les résultats. Pour en savoir plus sur cette bibliothèque, consultez mon tutoriel: Présentation de la bibliothèque Matplotlib de Python.
Le résultat du script ci-dessus est le suivant:
Dans ce tutoriel, nous avons découvert le détecteur de bord Canny et avons vu comment le scikit-image
et OpenCV
les bibliothèques nous permettent d’implémenter facilement ce détecteur avec quelques lignes de code.