Detección de características, Parte 3: Detección de esquinas de Harris

La detección de características es un dominio de la visión por computadora que se centra en el uso de herramientas para detectar regiones de interés en imágenes. Un aspecto importante de la mayoría de los algoritmos de detección de características es que no emplean aprendizaje automático, lo que hace que los resultados sean más interpretables e incluso más rápidos en algunos casos.

En los dos artículos anteriores de esta serie, analizamos los operadores más populares para detectar bordes de imágenes: Sobel, Scharr, Laplacian, junto con el gaussiano utilizado para suavizar imágenes. De una forma u otra, estos operadores utilizaron derivados y gradientes de imágenes ocultos, representados por núcleos convolucionales.

Al igual que con los bordes, en el análisis de imágenes suele explorarse otro tipo de región local: las esquinas. Las esquinas aparecen con menos frecuencia que los bordes y normalmente indican un cambio de dirección del borde de un objeto o el final de un objeto y el comienzo de otro. Los rincones son más raros de encontrar y proporcionan información más valiosa.

Ejemplo

Imagina que estás coleccionando un rompecabezas 2D. Lo que la mayoría de la gente hace al principio es encontrar una pieza con una parte de imagen que contenga el borde (borde) de un objeto. ¿Por qué? Porque de esta manera es más fácil identificar piezas adyacentes, ya que el número de piezas que comparten un borde de objeto similar es mínimo.

Podemos ir aún más lejos y centrarnos en seleccionar no los bordes sino las esquinas: una región donde un objeto cambia la dirección de sus bordes. Estas piezas son incluso más raras que los simples bordes y permiten una búsqueda aún más fácil de otros fragmentos adyacentes debido a su forma única.

Por ejemplo, en el siguiente rompecabezas, hay 6 aristas (B2, B3, B4, D2, D3 y D4) y ​​sólo 1 esquina (C5). Al elegir la esquina desde el principio, resulta más fácil localizar su posición porque es menos común que los bordes.

El objetivo de este artículo es comprender cómo se pueden detectar las esquinas. Para ello, comprenderemos los detalles del algoritmo de detección de esquinas de Harris, uno de los métodos más simples y populares desarrollado en 1988.

Idea

Tomemos tres tipos de regiones: planas, de borde y de esquina. Ya hemos mostrado la estructura de estas regiones arriba. Nuestro objetivo será comprender la distribución de gradientes en estos tres casos.

Durante nuestro análisis, también construiremos una elipse que contenga la mayoría de los puntos trazados. Como veremos, su forma proporcionará fuertes indicaciones del tipo de región con la que estamos tratando.

región plana

Una región plana es el caso más simple. Por lo general, toda la región de la imagen tiene casi los mismos valores de intensidad, lo que hace que los valores de gradiente en los ejes X e Y sean menores y estén centrados alrededor de 0.

Al tomar los puntos de gradiente (Gₓ, Gᵧ) del ejemplo de imagen plana anterior, podemos trazar su distribución, que se ve a continuación:

Ahora podemos construir una elipse alrededor de los puntos trazados que tenga un centro en (0, 0). Entonces podemos identificar sus dos ejes principales:

El eje principal a lo largo del cual se estira al máximo la elipse. El eje menor a lo largo del cual la elipse alcanza su extensión mínima.

En el caso de la región plana, puede resultar difícil diferenciar visualmente entre los ejes mayor y menor, ya que la elipse tiende a tener una forma circular, como en nuestra situación.

Sin embargo, para cada uno de los dos ejes principales, podemos calcular los radios de elipse λ₁ y λ₂. Como se muestra en la imagen de arriba, son casi iguales y tienen valores relativos pequeños.

Región de borde

Para la región del borde, la intensidad cambia solo en la zona del borde. Fuera del borde, la intensidad se mantiene casi igual. Dado eso, la mayoría de los puntos de gradiente todavía están centrados alrededor de (0, 0).

Sin embargo, en una pequeña parte alrededor de la zona del borde, los valores del gradiente pueden cambiar drásticamente en ambas direcciones. En el ejemplo de la imagen anterior, el borde es diagonal y podemos ver cambios en ambas direcciones. Por lo tanto, la distribución del gradiente está sesgada en la dirección diagonal como se muestra a continuación:

Para las regiones de borde, la elipse trazada normalmente está sesgada hacia una dirección y tiene radios λ₁ y λ₂ muy diferentes.

Región de la esquina

Para las curvas, la mayoría de los valores de intensidad fuera de las esquinas permanecen iguales; por lo tanto, la distribución de la mayoría de los puntos todavía se ubica cerca del centro (0, 0).

Si observamos la estructura de las esquinas, podemos considerarla aproximadamente como una intersección de dos aristas que tienen dos direcciones diferentes. Para las aristas, ya hemos comentado en la sección anterior que la distribución va en la misma dirección ya sea en X o Y, o en ambas direcciones.

Al tener dos aristas para la esquina, terminamos con dos espectros de puntos diferentes que crecen en dos direcciones diferentes desde el centro. A continuación se muestra un ejemplo.

Finalmente, si construimos una elipse alrededor de esa distribución, notaremos que es más grande que en los casos plano y de borde. Podemos diferenciar este resultado midiendo λ₁ y λ₂, que en este escenario tomarán valores mucho mayores.

Visualización

Acabamos de ver tres escenarios en los que λ tomó valores diferentes. Para visualizar mejor los resultados, podemos construir un diagrama a continuación:

Diagrama que muestra la relación entre los valores de λ y los tipos de región.

Fórmula

Para poder clasificar una región en una de tres zonas, comúnmente se usa la siguiente fórmula para estimar el coeficiente R:

R = λ₁ ⋅ λ₂ – k ⋅ (λ₁ + λ₂)², donde 0,04 ≤ k ≤ 0,06

Según el valor R, podemos clasificar la región de la imagen:

R < 0 – región de borde R ~ 0 – región plana R > 0 – región de esquina

OpenCV

La detección de Harris Corner se puede implementar fácilmente en OpenCV utilizando la función cv2.CornerHarris. Veamos en el siguiente ejemplo cómo se puede hacer.

Aquí está la imagen de entrada con la que trabajaremos:

Imagen de entrada

Primero, importemos las bibliotecas necesarias.

importar numpy como np importar cv2 importar matplotlib.pyplot como plt

Vamos a convertir la imagen de entrada a formato de escala de grises, ya que el detector Harris trabaja con intensidades de píxeles. También es necesario convertir el formato de imagen a float32, ya que los valores calculados asociados con los píxeles pueden exceder los límites. [0, 255].

ruta = ‘datos/entrada/formas.png’ imagen = cv2.imread(ruta) imagen_escala de grises = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY) imagen_escala de grises = np.float32(imagen_escala de grises)

Ahora podemos aplicar el filtro Harris. La función cv2.cornerHarris toma cuatro parámetros:

grayscale_image: ingresa una imagen en escala de grises en formato float32. blockSize (= 2): define las dimensiones del bloque de píxeles en la vecindad del píxel de destino considerado para la detección de esquinas. ksize (= 3): la dimensión del filtro Sobel utilizado para calcular las derivadas. k (= 0,04) – coeficiente en la fórmula utilizada para calcular el valor de R. R = cv2.cornerHarris(grayscale_image, 2, 3, 0.04) R = cv2.dilate(R, Ninguno)

La función cv2.cornerHarris devuelve una matriz de las dimensiones exactas de la imagen original en escala de grises. Sus valores pueden estar muy fuera del rango normal. [0, 255]. Para cada píxel, esa matriz contiene el valor del coeficiente R que vimos anteriormente.

cv2.dilate es un operador morfológico que opcionalmente se puede usar inmediatamente después para agrupar visualmente mejor las esquinas locales.

Una técnica común consiste en definir un umbral por debajo del cual los píxeles se consideran esquinas. Por ejemplo, podemos considerar todos los píxeles de la imagen como esquinas cuyo valor R es mayor que el valor R global máximo dividido por 100. En nuestro ejemplo, asignamos dichos píxeles al color rojo (0, 0, 255).

Para visualizar una imagen, necesitamos convertirla al formato RGB.

imagen[R > 0.01 * R.max()] = [0, 0, 255]
imagen_rgb = cv2.cvtColor(imagen, cv2.COLOR_BGR2RGB)

Finalmente, usamos maplotlib para mostrar la imagen de salida.

plt.figure(figsize=(10, 8)) plt.imshow(image_rgb) plt.title(‘Detección de esquinas de Harris’) plt.axis(‘off’) plt.tight_layout() plt.show()

Aquí está el resultado:

Imagen de salida. El color rojo indica las esquinas.

Conclusión

En este artículo, hemos examinado un método sólido para determinar si una región de una imagen es una esquina. La fórmula presentada para estimar el coeficiente R funciona bien en la gran mayoría de los casos.

En la vida real, existe una necesidad común de ejecutar un clasificador de bordes para una imagen completa. Construir una elipse alrededor de los puntos de gradiente y estimar el coeficiente R cada vez requiere muchos recursos, por lo que se utilizan técnicas de optimización más avanzadas para acelerar el proceso. Sin embargo, se basan en gran medida en la intuición que estudiamos aquí.

Recursos

Todas las imágenes, a menos que se indique lo contrario, son del autor.