Détection de blob ou de cercle OpenCV
Ce tutoriel discutera de la détection de blobs ou de cercles dans une image à l’aide de la classe SimpleBlobDetector
d’OpenCV en Python.
Utilisez la classe SimpleBlobDetector
d’OpenCV pour détecter des blobs ou des cercles dans une image en Python
Nous pouvons détecter des blobs ou des cercles dans une image en utilisant la classe SimpleBlobDetector
d’OpenCV. Nous pouvons détecter une goutte ou un cercle en utilisant sa surface, sa circularité, sa convexité et son inertie.
Si nous voulons détecter des blobs ou des cercles qui tombent à l’intérieur d’une zone spécifique, nous devons définir l’argument filterByArea
sur vrai. Ensuite, nous pouvons utiliser le paramètre minArea
pour définir la zone minimale du blob et le paramètre maxArea
pour définir la zone maximale du blob.
Il ne détectera pas les gouttes inférieures ou supérieures à la zone spécifiée. Nous pouvons utiliser la méthode Params()
de la classe SimpleBlobDetector
pour modifier la forme que nous voulons détecter.
On peut utiliser la fonction drawKeypoints()
d’OpenCV pour mettre en évidence les blobs détectés par la fonction.
Par exemple, détectons des blobs dans une image donnée en fonction de la zone de blobs. Voir le code ci-dessous.
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
cv2.imshow("Blobs Using Area", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
Production :
Définissez le filterByCircularity
pour filtrer les blobs ou les cercles dans une image en Python
Nous pouvons également détecter un blob en utilisant sa circularité, ce qui vérifiera à quel point la forme est circulaire. La circularité est de 1 pour un cercle et de 0,78 pour une boîte.
Si nous ne voulons détecter que des blobs circulaires, nous devons définir l’argument filterByCircularity
sur True. Ensuite, nous pouvons utiliser minCircularity
et maxCircularity
pour définir la valeur de circularité minimale et maximale de la forme.
Il ne détectera pas les blobs avec une circularité supérieure ou inférieure à celle spécifiée. Par exemple, définissons la circularité dans l’exemple ci-dessus. Voir le code ci-dessous.
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
params.filterByCircularity = True
params.minCircularity = 0.9
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
cv2.imshow("Using area,circularity", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
Production :
Comme vous pouvez le voir, seuls les blobs circulaires ont été détectés dans la sortie ci-dessus.
Définissez le filterByConvexity
pour filtrer les blobs ou les cercles dans une image en Python
Nous pouvons également filtrer les blobs en utilisant leur convexité. Tout d’abord, nous devons définir l’argument filterByConvexity
sur true, puis nous pouvons utiliser minConvexity
et maxConvexity
pour définir la valeur minimale et maximale de la convexité.
Une ellipse est aussi un cercle, sera également détectée avec un cercle parfait. Nous pouvons utiliser l’argument filterInertia
pour filtrer les blobs en utilisant l’inertie des formes.
Pour un cercle parfait, l’inertie est de 1, et pour une ellipse, elle est comprise entre 0 et 1. Nous pouvons utiliser les minInertiaRatio
et maxInertiaRatio
pour définir la valeur minimale et maximale de l’inertie.
On peut aussi afficher le nombre de blobs sur l’image en utilisant la fonction putText()
d’OpenCV.
Par exemple, définissons la valeur de la convexité et de l’inertie et affichons le nombre de blobs détectés au-dessus de l’image donnée. Voir le code ci-dessous.
import cv2
import numpy as np
image = cv2.imread("blob2.jpg", 0)
params = cv2.SimpleBlobDetector_Params()
params.filterByArea = True
params.minArea = 100
params.filterByCircularity = True
params.minCircularity = 0.9
params.filterByConvexity = True
params.minConvexity = 0.2
params.filterByInertia = True
params.minInertiaRatio = 0.01
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(image)
blank = np.zeros((1, 1))
blobs = cv2.drawKeypoints(
image, keypoints, blank, (0, 0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
)
number_of_blobs = len(keypoints)
text = "Circular Blobs: " + str(len(keypoints))
cv2.putText(blobs, text, (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)
cv2.imshow("Original Image", image)
cv2.imshow("Circular Blobs Only", blobs)
cv2.waitKey(0)
cv2.destroyAllWindows()
Production :
Nous pouvons également définir la position, la famille de polices, l’échelle de police, la couleur et l’épaisseur de ligne du texte. Nous avons également montré l’image originale sur la gauche à titre de comparaison.
Nous pouvons également filtrer les blobs en fonction de leurs couleurs en définissant l’argument filterByColor
sur true. Ensuite, nous pouvons utiliser les minThreshold
et maxThreshold
pour définir ces seuils minimum et maximum de la couleur que nous voulons détecter.
Il ne détectera pas les blobs avec des valeurs de couleur inférieures ou supérieures au seuil spécifié. On peut aussi détecter d’autres formes en changeant les paramètres de la classe SimpleBlobDetector
.
Par exemple, nous avons détecté le blob de forme circulaire dans l’exemple ci-dessus, mais nous pouvons également détecter des blobs d’autres formes comme un blob rectangulaire.
Cliquez sur ce lien pour plus de détails sur les paramètres de la classe SimpleBlobDetector
.
Article connexe - Python OpenCV
- Afficher une image à l'aide d'OpenCV en Python
- Créer un scanner de code QR à l'aide d'OpenCV en Python
- Fonction OpenCV sobel()
- Fonctionnalités de l'interface graphique d'OpenCV en Python
- L'espace colorimétrique HSV utilisant OpenCV en Python
- Filtres de flou dans OpenCV