Skip to content

Clase 13 — Tema 10: Detección de Líneas con la Transformada de Hough

Resumen Ejecutivo

Clase teórico-práctica (≈1h). Se presenta el algoritmo de Hough para detección de líneas como siguiente paso del pipeline de visión artificial: partir de una imagen de bordes (Canny) y detectar estructuras geométricas. Se explica la representación polar de rectas (\(\rho\), \(\theta\)), la matriz acumuladora, el concepto de votaciones y el efecto del umbral. Al final de la clase se arranca con el cuaderno de OpenCV mostrando el funcionamiento de cv2.HoughLines con trackbars interactivos. La detección de esquinas (también en el Tema 10) queda fuera del programa.


Conceptos Clave

  • Pipeline de visión artificial: suavizado → detección de bordes → detección de estructuras geométricas (líneas, contornos). ⚠️ EXAMEN
  • Representación polar de rectas: una recta queda definida por \((\rho, \theta)\): distancia perpendicular desde el origen y ángulo de ese segmento con el eje X. ⚠️ EXAMEN
  • Transformada de Hough clásica (HoughLines): algoritmo de votación en espacio polar. Cada punto de borde vota a todas las rectas candidatas; las más votadas son las detectadas.
  • Matriz acumuladora: estructura 2D indexada por rangos discretizados de \(\rho\) y \(\theta\); cada celda acumula los votos de los puntos de borde.
  • Umbral de votaciones: cuántos puntos deben votar una recta para que sea considerada detectada. Subir el umbral → menos líneas (más exigente); bajarlo → más líneas y más ruido.
  • Convenio de OpenCV: trabaja en \(\theta \in [0°, 180°]\). Las rectas con \(\theta > 180°\) se devuelven con \(\rho\) negativo y \(\theta - 180°\). Hay que deshacer este convenio para comparar líneas.
  • Parámetros fijos habituales: \(\rho = 1\) (píxel), \(\theta = 1°\) (en radianes).
  • Detección de esquinas: queda fuera del temario por falta de tiempo.

Desarrollo del Temario

1. Motivación — ¿por qué detectar líneas es difícil?

En imágenes reales la imagen de bordes nunca es perfecta: - Pueden faltar puntos por problemas de iluminación. - Hay desplazamientos de píxeles que rompen la alineación perfecta.

Hough propone un algoritmo robusto a estos problemas: en lugar de buscar puntos perfectamente alineados, usa un mecanismo de votación.

2. Representación polar de rectas

Una recta en coordenadas polares se define con dos parámetros:

\[\rho = x \cos\theta + y \sin\theta\]
Parámetro Significado
\(\rho\) Longitud del segmento perpendicular desde el origen hasta la recta
\(\theta\) Ángulo entre ese segmento y el eje X

Casos especiales: - Recta horizontal: \(\theta = 90°\), \(\rho\) = distancia al origen. - Recta vertical: \(\theta = 0°\), \(\rho\) = distancia al origen.

En coordenadas de imagen el eje Y crece hacia abajo, pero la representación es idéntica.

3. Algoritmo de Hough — funcionamiento

Entrada: imagen binaria de bordes (fondo negro, bordes blancos; salida típica de Canny).

Proceso:

  1. Inicializar la matriz acumuladora a cero. Sus filas representan rangos de \(\rho\), sus columnas rangos de \(\theta\) (ambos discretizados).
  2. Para cada punto de borde \((x, y)\):
  3. Recorrer todos los valores posibles de \(\theta\).
  4. Calcular el \(\rho\) correspondiente con la ecuación anterior.
  5. Incrementar en 1 la celda \((\rho, \theta)\) de la matriz.
  6. Al finalizar, las celdas con más votos corresponden a las rectas más probables de la imagen.
  7. Aplicar un umbral: solo se devuelven las rectas con votos ≥ umbral.

Analogía: cada punto de borde "lanza un dardo" a todas las rectas a las que podría pertenecer. Las rectas con más impactos son las reales.

4. Tamaño de la matriz acumuladora

Depende de la precisión deseada: - En \(\theta\): número de columnas = \(180° /\) resolución en grados. - En \(\rho\): el valor máximo es la diagonal de la imagen (\(\sqrt{w^2 + h^2}\)). OpenCV duplica las filas porque trabaja también con \(\rho\) negativos.

Ejemplo para imagen 25×25 con precisión de 1 px: - Diagonal = \(\sqrt{25^2 + 25^2} \approx 35\) px → 35 × 2 = 70 filas.

5. Función cv2.HoughLines

lines = cv2.HoughLines(img_canny, rho, theta, threshold)
Parámetro Descripción Valor habitual
img_canny Imagen binaria de bordes —
rho Resolución en \(\rho\) (píxeles) 1
theta Resolución en \(\theta\) (radianes) np.pi / 180 (1°)
threshold Mínimo de votos para considerar una recta prueba y error

Retorno: vector de rectas, cada una como [rho, theta] en coordenadas polares.

Efecto del umbral:

Umbral Resultado
Bajo Muchas líneas, incluido ruido
Alto Pocas líneas, solo las más evidentes
Demasiado bajo (= 1) Cualquier punto de borde genera una recta → ruido extremo

No existe un valor universal: depende del tamaño de la imagen y del contenido. Se ajusta por prueba y error.

6. Convenio de signos en OpenCV ⚠️ EXAMEN

HoughLines opera en \(\theta \in [0°, 180°]\). Para rectas con ángulo real > 180°: - Devuelve \(\rho\) negativo. - Devuelve \(\theta - 180°\) en radianes.

Para deshacer el convenio y trabajar con ángulos en \([0°, 360°]\) y \(\rho\) siempre positivo:

if rho < 0:
    rho = -rho
    theta = theta + np.pi   # sumar 180°

Esto facilita la comparación entre líneas y la eliminación de duplicados.

7. Uso con trackbars en OpenCV

La clase mostró cómo usar cv2.createTrackbar para ajustar el umbral de forma interactiva sin recompilar:

cv2.namedWindow("trackbars")
cv2.createTrackbar("threshold", "trackbars", min_val, max_val, callback_fn)

La función de callback recibe el nuevo valor del slider y activa un flag para que el bucle principal recalcule HoughLines solo cuando el umbral cambia.


Ejemplos y Ejercicios

Ejemplo del sudoku: - Entrada: imagen del sudoku. - Paso 1: cv2.Canny → imagen de bordes. - Paso 2: cv2.HoughLines con umbral ajustado → líneas de la rejilla detectadas. - Resultado: con umbral bajo aparecen líneas diagonales inexistentes; subiendo el umbral (~115+) solo quedan las líneas reales de la cuadrícula.

Ejemplo de recta única: HoughLines puede devolver múltiples entradas para la misma recta física (por la escalera de píxeles). Esto se resuelve con postproceso de limpieza (función cleanLines, presentada en la clase 14).


Preguntas Tipo Examen

  1. ¿Qué representa cada celda de la matriz acumuladora en la transformada de Hough?
  2. ¿Cuál es la ecuación que relaciona un punto \((x, y)\) con \(\rho\) y \(\theta\)? ¿Qué significa cada parámetro?
  3. ¿Qué ocurre si bajamos mucho el umbral de HoughLines? ¿Y si lo subimos en exceso?
  4. ¿Por qué HoughLines puede devolver \(\rho\) negativo? ¿Cómo se deshace ese convenio?
  5. ¿Cuántas filas necesita la matriz acumuladora para una imagen de 100×100 px con precisión de 1 px en \(\rho\)? Calcula la diagonal.
  6. ¿Qué tipo de imagen acepta HoughLines como entrada y cómo se obtiene habitualmente?
  7. Describe el pipeline completo desde una imagen en color hasta la detección de líneas.