La detección circular encuentra una variedad de usos en aplicaciones biomédicas, que van desde la detección del iris hasta la segmentación de glóbulos blancos. La técnica seguida es similar a la que se utiliza para detectar líneas, como se comenta en este artículo .
Conceptos básicos de la detección de círculos
Un círculo puede ser descrito por la siguiente ecuación:
Para detectar círculos, podemos fijar un punto (x, y). Ahora, estamos obligados a encontrar 3 parámetros: a, b y r. Por lo tanto, el problema está en un espacio de búsqueda tridimensional. Para encontrar posibles círculos, el algoritmo utiliza una array tridimensional llamada «array acumuladora» para almacenar valores potenciales a, b y r. El valor de a (coordenada x del centro) puede variar de 1 a filas, b (coordenada y del centro) puede variar de 1 a cols, y r puede variar de 1 a maxRadius = .
A continuación se muestran los pasos del algoritmo.
- Inicializando la Array Acumuladora: Inicialice una array de dimensiones filas * columnas * maxRadius con ceros.
- Preprocesamiento de la imagen: aplique desenfoque, escala de grises y un detector de bordes en la imagen. Esto se hace para garantizar que los círculos se muestren como bordes de imagen oscurecidos.
- Bucle a través de los puntos: Elija un punto en la imagen.
- Corrección de r y bucle a través de a y b: use un bucle anidado doble para encontrar un valor de r, variando a y b en los rangos dados.
for
a
in
range
(rows):
for
b
in
range
(cols):
r
=
math.sqrt((xi
-
a)
*
*
2
+
(yi
-
b)
*
*
2
)
accum_matrix[a][b][r]
+
=
1
- Votación: elija los puntos en la array del acumulador con el valor máximo. Estos son puntos fuertes que indican la existencia de un círculo con parámetros a, b y r. Esto nos da el espacio de círculos de Hough.
- Encontrar círculos: finalmente, utilizando los círculos anteriores como círculos candidatos, vote de acuerdo con la imagen. El círculo máximo votado en la array del acumulador nos da el círculo.
La HoughCircles
función en OpenCV tiene los siguientes parámetros que se pueden modificar según la imagen.
Método de detección: OpenCV tiene una implementación avanzada, HOUGH_GRADIENT, que utiliza el gradiente de los bordes en lugar de llenar toda la array del acumulador 3D, lo que acelera el proceso.
dp: esta es la relación entre la resolución de la imagen original y la array del acumulador.
minDist: este parámetro controla la distancia mínima entre los círculos detectados.
Param1: la detección de bordes astutos requiere dos parámetros: minVal y maxVal. Param1 es el umbral más alto de los dos. El segundo está configurado como Param1/2.
Param2: este es el umbral del acumulador para los círculos detectados candidatos. Al aumentar este valor de umbral, podemos garantizar que solo se devuelvan los mejores círculos, correspondientes a valores acumulados más grandes.
minRadius: Radio mínimo del círculo.
maxRadius: Radio máximo del círculo.
A continuación se muestra el código para encontrar círculos usando OpenCV en la imagen de entrada anterior.
import cv2 import numpy as np # Read image. img = cv2.imread('eyes.jpg', cv2.IMREAD_COLOR) # Convert to grayscale. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Blur using 3 * 3 kernel. gray_blurred = cv2.blur(gray, (3, 3)) # Apply Hough transform on the blurred image. detected_circles = cv2.HoughCircles(gray_blurred, cv2.HOUGH_GRADIENT, 1, 20, param1 = 50, param2 = 30, minRadius = 1, maxRadius = 40) # Draw circles that are detected. if detected_circles is not None: # Convert the circle parameters a, b and r to integers. detected_circles = np.uint16(np.around(detected_circles)) for pt in detected_circles[0, :]: a, b, r = pt[0], pt[1], pt[2] # Draw the circumference of the circle. cv2.circle(img, (a, b), r, (0, 255, 0), 2) # Draw a small circle (of radius 1) to show the center. cv2.circle(img, (a, b), 1, (0, 0, 255), 3) cv2.imshow("Detected Circle", img) cv2.waitKey(0)
Producción:
Publicación traducida automáticamente
Artículo escrito por Anannya Uberoi 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA