Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

imfindcircles

Encontrar círculos utilizando la transformada de Hough circular

Descripción

centers = imfindcircles(A,radius) encuentra los círculos en la imagen A cuyos radios son aproximadamente iguales a radius. La salida, centers, es una matriz de dos columnas que contiene las coordenadas (x,y) de los centros de los círculos en la imagen.

[centers,radii] = imfindcircles(A,radiusRange) encuentra círculos con radios en el intervalo especificado por radiusRange. El argumento de salida adicional, radii, contiene los radios estimados correspondientes a cada centro del círculo en centers.

ejemplo

[centers,radii,metric] = imfindcircles(A,radiusRange) también devuelve un vector columna, metric, que contiene las magnitudes de los picos del arreglo acumulador para cada círculo (en orden descendente). Las filas de centers y radii corresponden a las filas de metric.

ejemplo

[___] = imfindcircles(___,Name=Value) especifica opciones adicionales con uno o más argumentos de nombre-valor utilizando cualquiera de las sintaxis anteriores.

Ejemplos

contraer todo

Este ejemplo muestra cómo encontrar todos los círculos en una imagen, y cómo mantener y mostrar los círculos más intensos.

Lea una imagen en escala de grises en el espacio de trabajo y muéstrela en pantalla.

A = imread('coins.png');
imshow(A)

Figure contains an axes object. The axes object contains an object of type image.

Encuentre todos los círculos con radio r en el intervalo [15, 30].

[centers, radii, metric] = imfindcircles(A,[15 30]);

Mantenga los cinco círculos más intensos según los valores métricos.

centersStrong5 = centers(1:5,:); 
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);

Dibuje los cinco perímetros de círculo más intensos sobre la imagen original.

viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');

Figure contains an axes object. The axes object contains 3 objects of type line, image.

Lea una imagen en el espacio de trabajo y muéstrela en pantalla.

A = imread('circlesBrightDark.png');
imshow(A)

Figure contains an axes object. The axes object contains an object of type image.

Defina el alcance del radio.

Rmin = 30;
Rmax = 65;

Encuentre todos los círculos claros de la imagen que se encuentran dentro del rango de radio.

[centersBright, radiiBright] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','bright');

Encuentre todos los círculos oscuros de la imagen que se encuentran dentro del rango de radio.

[centersDark, radiiDark] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','dark');

Dibuje líneas azules alrededor de los bordes de los círculos claros.

viscircles(centersBright, radiiBright,'Color','b');

Figure contains an axes object. The axes object contains 3 objects of type line, image.

Dibuje líneas de rayas rojas alrededor de los bordes de los círculos oscuros.

viscircles(centersDark, radiiDark,'LineStyle','--');

Figure contains an axes object. The axes object contains 5 objects of type line, image.

Argumentos de entrada

contraer todo

Imagen de entrada en la que detectar objetos circulares, especificada como una imagen en escala de grises, en color verdadero (RGB) o binaria.

Tipos de datos: single | double | int16 | uint8 | uint16 | logical

Radio del círculo, o el radio aproximado de los objetos circulares que desea detectar, especificado como un número positivo.

Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Intervalo de los radios de los objetos circulares que desea detectar, especificado como vector de 2 elementos de enteros positivos con el formato [rmin rmax], donde rmin es menor que rmax.

Tipos de datos: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Argumentos de par nombre-valor

Especifique pares de argumentos opcionales como Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value es el valor correspondiente. Los argumentos de nombre-valor deben aparecer después de otros argumentos. Sin embargo, el orden de los pares no importa.

Ejemplo: centers = imfindcircles(A,radius,ObjectPolarity=bright) especifica objetos circulares claros sobre un fondo oscuro.

En las versiones anteriores a la R2021a, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: centers = imfindcircles(A,radius,"ObjectPolarity","bright") especifica objetos circulares claros sobre un fondo oscuro.

Polaridad del objeto, especificada como uno de los siguientes valores de la tabla.

"bright"Los objetos circulares son más claros que el fondo.
"dark"Los objetos circulares son más oscuros que el fondo.

Método de cálculo empleado para calcular el arreglo acumulador, especificado como uno de los siguientes valores de la tabla.

"PhaseCode"Método de codificación de fase de Atherton y Kerbyson[1].
"TwoStage"El método utilizado en la transformada de Hough circular de dos etapas [2], [3].

Ejemplo: "Method","PhaseCode" especifica el método de codificación de fase de Atherton y Kerbyson.

Factor de sensibilidad para el arreglo acumulador de la transformada de Hough circular, especificado como número en el intervalo [0, 1]. A medida que aumenta el factor de sensibilidad, imfindcircles detecta más objetos circulares, incluidos los círculos débiles y parcialmente tapados. Los valores de sensibilidad más altos también aumentan el riesgo de falsas detecciones.

Umbral de gradiente del borde para determinar los píxeles del borde de la imagen, especificado como número en el intervalo [0, 1]. Especifique 0 para establecer el umbral en la magnitud de gradiente cero. Especifique 1 para establecer el umbral en la magnitud máxima del gradiente. imfindcircles detecta más objetos circulares (con bordes débiles e intensos) cuando establece el umbral a un valor más bajo. Detecta menos círculos con bordes débiles a medida que aumenta el valor del umbral. Por defecto, imfindcircles elige el umbral del gradiente de los bordes automáticamente mediante la función graythresh.

Ejemplo: "EdgeThreshold",0.5

Argumentos de salida

contraer todo

Coordenadas de los centros de los círculos, devueltas como una matriz de P-por-2 que contiene las coordenadas xde los centros de los círculos en la primera columna y las coordenadas y, en la segunda. El número de filas, P, es el número de círculos detectados. centers se ordena en función de la fuerza de los círculos, del más intenso al más débil.

Tipos de datos: double

Radios estimados de los centros de los círculos, devueltos como un vector columna. El valor del radio en radii(j) corresponde al círculo centrado en centers(j,:).

Tipos de datos: double

Intensidades de los círculos proporciona las intensidades relativas de los centros de los círculos, devueltas como un vector columna. El valor en metric(j) corresponde al círculo con el radio centers(j,:) centrado en centers(j,:).

Tipos de datos: double

Sugerencias

  • La precisión de imfindcircles es limitada cuando el valor de radius (o rmin) es menor o igual a 5.

  • El paso de estimación del radio suele ser más rápido si se utiliza el método (por defecto) "PhaseCode" en lugar de "TwoStage".

  • Ambos métodos de cálculo "PhaseCode" y "TwoStage" están limitados en su capacidad de detectar círculos concéntricos. Los resultados de los círculos concéntricos pueden variar en función de la imagen de entrada.

  • imfindcircles no encuentra círculos con centros fuera del dominio de la imagen.

  • imfindcircles convierte las imágenes en color verdadero a escala de grises mediante la función rgb2gray antes de procesarlas. Las imágenes de tipo binario (logical) y de tipo entero se convierten al tipo de datos single utilizando la función im2single antes de procesarlas. Para mejorar la precisión del resultado para las imágenes binarias, imfindcircles también aplica el suavizado gaussiano utilizando imfilter como paso de preprocesamiento.

Algoritmos

imfindcircles utiliza un algoritmo basado en la transformada de Hough circular (CHT) para encontrar círculos en las imágenes. Este enfoque se utiliza por su solidez en presencia de ruido, oclusión e iluminación variable.

La CHT no es un algoritmo rigurosamente especificado, sino que hay una serie de enfoques diferentes que pueden adoptarse en su aplicación. Sin embargo, hay tres pasos importantes que son comunes a todos los enfoques.

  1. Cálculo del arreglo acumulador

    Los píxeles de primer plano de alto gradiente se designan como píxeles candidatos y se les permite emitir “votos” en el arreglo acumulador. En una implementación clásica de la CHT, los píxeles candidatos votan en un patrón a su alrededor que forma un círculo completo de radio fijo. La Figura 1a muestra un ejemplo de un píxel candidato situado en un círculo real (círculo sólido) y el patrón de votación clásico de la CHT (círculos discontinuos) para el píxel candidato.

    Patrón de voto clásico de la CHT

    Accumulator array voting patterns for candidate points lying on the edge of a circle

  2. Estimación del centro

    Los votos de los píxeles candidatos que pertenecen a un círculo de la imagen tienden a acumularse en el bin del arreglo acumulador correspondiente al centro del círculo. Por lo tanto, los centros de los círculos se estiman detectando los picos en el arreglo acumulador. La Figura 1b muestra un ejemplo de los píxeles candidatos (puntos sólidos) situados en un círculo real (círculo sólido), y sus patrones de votación (círculos discontinuos) que coinciden en el centro del círculo real.

  3. Estimación del radio

    Si se utiliza el mismo arreglo acumulador para más de un valor de radio, como se suele hacer en los algoritmos de la CHT, los radios de los círculos detectados tienen que estimarse como un paso separado.

imfindcircles proporciona dos algoritmos para encontrar círculos en las imágenes: el de codificación de fase (por defecto) y el de dos etapas. Ambos comparten algunos pasos computacionales comunes, pero cada uno tiene también sus propios aspectos únicos.

Las características computacionales comunes que comparten ambos algoritmos son las siguientes:

  • Uso de un arreglo acumulador 2D

    La transformada de Hough clásica requiere un arreglo 3D para almacenar los votos de varios radios, lo que supone grandes necesidades de almacenamiento y largos tiempos de procesamiento. Tanto el método de codificación de fase como el de dos etapas resuelven este problema utilizando un único arreglo acumulador 2D para todos los radios. Aunque este enfoque requiere un paso adicional de estimación del radio, la carga computacional total suele ser menor, especialmente cuando se trabaja en un intervalo de radios amplio. Esta es una práctica ampliamente adoptada en las implementaciones modernas de la CHT.

  • Uso de píxeles de borde

    Los requisitos generales de memoria y la velocidad se rigen en gran medida por el número de píxeles candidatos. Para limitar su número, la magnitud del gradiente de la imagen de entrada se umbraliza para que solo los píxeles de alto gradiente se incluyan en el recuento de votos.

  • Uso de la información sobre la orientación de los bordes

    El rendimiento también se optimiza restringiendo el número de bins disponibles para los píxeles candidatos. Esto se consigue utilizando la información de los bordes disponible localmente para permitir únicamente la votación en un intervalo limitado a lo largo de la dirección del gradiente (Figura 2). La anchura del intervalo de votación, entre los puntos cmin y cmax en la figura, está determinada por el intervalo del radio definido por rmin y rmax.

    Modo de votación: radios múltiples, a lo largo de la dirección del gradiente

    Graphical representation of the permitted voting interval for a candidate pixel. The direction of the voting interval is perpendicular to the edge of the circle at the candidate point.

rminRadio mínimo de búsqueda
rmaxRadio máximo de búsqueda
ractualRadio del círculo al que pertenece el píxel candidato
cminCentro del círculo de radio rmin
cmaxCentro del círculo de radio rmax
cactualCentro del círculo de radio ractual

Los dos métodos de CHT empleados por la función imfindcircles difieren fundamentalmente en la forma de calcular los radios del círculo.

  • Dos fases

    Los radios se estiman explícitamente utilizando los centros de los círculos estimados junto con la información de la imagen. La técnica se basa en el cálculo de histogramas radiales [2] [3].

  • Codificación de fase

    Los radios se estiman a partir de los valores complejos del arreglo acumulador, con la información del radio codificada en la fase de las entradas del arreglo [1]. Los votos emitidos por los píxeles del borde contienen información no solo sobre las posibles ubicaciones del centro, sino también sobre el radio del círculo asociado a la ubicación del centro. A diferencia del método de dos etapas, en el que el radio debe estimarse explícitamente mediante histogramas radiales, en la codificación de fase el radio puede estimarse simplemente decodificando la información de la fase de la ubicación del centro estimada en el arreglo acumulador.

Referencias

[1] T.J Atherton, D.J. Kerbyson. "Size invariant circle detection." Image and Vision Computing. Volume 17, Number 11, 1999, pp. 795-803.

[2] H.K Yuen, .J. Princen, J. Illingworth, and J. Kittler. "Comparative study of Hough transform methods for circle finding." Image and Vision Computing. Volume 8, Number 1, 1990, pp. 71–77.

[3] E.R. Davies, Machine Vision: Theory, Algorithms, Practicalities. Chapter 10. 3rd Edition. Morgan Kauffman Publishers, 2005.

Capacidades ampliadas

Historial de versiones

Introducido en R2012a

expandir todo