Detección de blobs o círculos de OpenCV

Ammar Ali 12 abril 2022
Detección de blobs o círculos de OpenCV

Este tutorial analizará la detección de manchas o círculos en una imagen utilizando la clase SimpleBlobDetector de OpenCV en Python.

Use la clase SimpleBlobDetector de OpenCV para detectar manchas o círculos en una imagen en Python

Podemos detectar manchas o círculos en una imagen utilizando la clase SimpleBlobDetector de OpenCV. Podemos detectar una mancha o un círculo usando su área, circularidad, convexidad e inercia.

Si queremos detectar blobs o círculos que caen dentro de un área específica, debemos establecer el argumento filterByArea en verdadero. Luego podemos usar el parámetro minArea para establecer el área mínima del blob y el parámetro maxArea para establecer el área máxima del blob.

No detectará los blobs menores o mayores que el área especificada. Podemos usar el método Params() de la clase SimpleBlobDetector para cambiar la forma que queremos detectar.

Podemos utilizar la función drawKeypoints() de OpenCV para resaltar las manchas detectadas por la función.

Por ejemplo, detectemos algunas manchas en una imagen determinada según el área de la mancha. Vea el código a continuación.

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()

Producción:

Área de uso de Blob

Configure el filterByCircularity para filtrar blobs o círculos en una imagen en Python

También podemos detectar una mancha usando su circularidad, lo que comprobará cuánto es circular la forma. La circularidad es 1 para un círculo y 0,78 para una caja.

Si solo queremos detectar blobs circulares, debemos establecer el argumento filterByCircularity en True. Luego podemos usar minCircularity y maxCircularity para establecer el valor de circularidad mínimo y máximo para la forma.

No detectará los blobs con una circularidad mayor o menor que la especificada. Por ejemplo, establezcamos la circularidad en el ejemplo anterior. Vea el código a continuación.

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()

Producción:

blob usando área y circularidad

Como puede ver, solo se han detectado manchas circulares en el resultado anterior.

Configure el filterByConvexity para filtrar blobs o círculos en una imagen en Python

También podemos filtrar blobs usando su convexidad. Primero, tenemos que establecer el argumento filterByConvexity en verdadero, y luego podemos usar minConvexity y maxConvexity para establecer el valor mínimo y máximo de convexidad.

Una elipse también es un círculo, también se detectará junto con un círculo perfecto. Podemos usar el argumento filterInertia para filtrar los blobs usando la inercia de las formas.

Para un círculo perfecto, la inercia es 1, y para una elipse, está entre 0 y 1. Podemos usar minInertiaRatio y maxInertiaRatio para establecer el valor mínimo y máximo de la inercia.

También podemos mostrar el número de blobs en la imagen usando la función putText() de OpenCV.

Por ejemplo, establezcamos el valor de convexidad e inercia y mostremos la cantidad de manchas detectadas en la parte superior de la imagen dada. Vea el código a continuación.

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()

Producción:

blob usando todos los filtros

También podemos establecer la posición, la familia de fuentes, la escala de fuente, el color y el grosor de línea del texto. También hemos mostrado la imagen original a la izquierda para comparar.

También podemos filtrar blobs según sus colores estableciendo el argumento filterByColor como verdadero. Luego podemos usar el minThreshold y maxThreshold para establecer estos umbrales mínimo y máximo del color que queremos detectar.

No detectará las manchas con valores de color menores o mayores que el umbral especificado. También podemos detectar otras formas cambiando los parámetros de la clase SimpleBlobDetector.

Por ejemplo, detectamos la mancha de forma circular en el ejemplo anterior, pero también podemos detectar manchas de otras formas como una mancha rectangular.

Haga clic en este enlace para obtener más detalles sobre los parámetros de la clase SimpleBlobDetector.

Autor: 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

Artículo relacionado - Python OpenCV

Artículo relacionado - OpenCV Image