Détection de blob ou de cercle OpenCV

Ammar Ali 12 avril 2022
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 :

Blob utilisant la zone

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 :

blob utilisant la zone et la circularité

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 :

blob utilisant tous les filtres

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.

Auteur: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Article connexe - Python OpenCV

Article connexe - OpenCV Image