Skip to content

Clase 14 — Laboratorio: Hough Probabilístico, CleanLines y Actividad 3

Resumen Ejecutivo

Sesión de laboratorio (≈2h). Primera parte (≈20 min): cierre del Tema 10 con las funciones auxiliares drawLines y cleanLines, y presentación de cv2.HoughLinesP (Hough probabilístico para detectar segmentos). Segunda parte: presentación de las tres propuestas de la Actividad 3 (última actividad del curso). Entrega: lunes 15 de junio antes de las 21:00. Se puede usar en el examen cualquier actividad realizada aunque no se haya entregado. El Tema 12 no entra en el examen.


Conceptos Clave

  • drawLines: dibuja rectas devueltas por HoughLines (en polares) sobre una imagen, extendiéndolas con el parámetro limits.
  • cleanLines: elimina líneas duplicadas/similares de la salida de HoughLines usando tolerancias en \(\rho\) y \(\theta\). ⚠️ EXAMEN
  • Convenio OpenCV vs convenio propio: cleanLines deshace el convenio de \(\rho\) negativo para trabajar con ángulos en \([0°, 360°]\) y \(\rho > 0\).
  • HoughLinesP (Hough probabilístico): detecta segmentos (con extremos) en vez de rectas infinitas. Trabaja con una muestra de puntos de borde. ⚠️ EXAMEN
  • Parámetros extra de HoughLinesP: minLineLength (longitud mínima del segmento) y maxLineGap (máximo gap permitido dentro de un segmento).
  • Actividad 3: tres propuestas a elegir; solo entregar una. Recomendado hacer las tres como preparación para el examen.

Desarrollo del Temario

1. Función drawLines

Dibuja sobre una imagen las rectas devueltas por HoughLines, que vienen en formato polar \((\rho, \theta)\):

drawLines(img, lines, color, limits)
Parámetro Descripción
img Imagen (normalmente copia de la original en color) donde se pinta
lines Vector devuelto por HoughLines
color Color en formato BGR
limits Valor para extender la recta y que atraviese toda la imagen (ajustar según tamaño)

HoughLines devuelve rectas infinitas (solo \(\rho\) y \(\theta\), sin extremos). El parámetro limits permite que la recta dibujada atraviese completamente la imagen; si la imagen es 500×500 con limits=1000 es suficiente.

2. Función cleanLines — eliminación de duplicados ⚠️ EXAMEN

HoughLines puede devolver varias entradas para la misma recta física (especialmente en líneas diagonales representadas como "escalera" de píxeles). cleanLines las fusiona:

clean = cleanLines(lines, rho_tol, theta_tol)
Parámetro Descripción Ejemplo
lines Salida de HoughLines —
rho_tol Tolerancia en \(\rho\) (píxeles) 15
theta_tol Tolerancia en \(\theta\) (radianes) 7 * np.pi / 180

Funcionamiento interno: 1. Convierte todas las líneas al convenio propio: \(\rho > 0\), \(\theta \in [0°, 360°]\) (deshaciendo el convenio de OpenCV). 2. Construye una lista de líneas limpias. Para cada línea nueva la compara contra las ya aceptadas: si \(|\Delta\rho| <\) rho_tol y \(|\Delta\theta| <\) theta_tol, la descarta como duplicado.

Funciones auxiliares internas: - normalizeRhoTheta: pasa \(\rho\) negativo a positivo y suma \(\pi\) al ángulo. - angularDiff: calcula la diferencia real entre dos ángulos teniendo en cuenta la discontinuidad en \(0°/360°\) (igual que ocurre con la dirección del viento). - eqLines: compara dos líneas usando las tolerancias dadas.

Importante: la tolerancia en \(\theta\) se pasa siempre en radianes aunque se piense en grados.

3. HoughLinesP — Hough probabilístico ⚠️ EXAMEN

Detecta segmentos (no rectas infinitas) y devuelve sus extremos \((x_1, y_1, x_2, y_2)\).

segments = cv2.HoughLinesP(img_canny, rho, theta, threshold,
                           minLineLength, maxLineGap)
Parámetro Descripción Valor habitual
rho Resolución en \(\rho\) 1
theta Resolución en \(\theta\) np.pi / 180
threshold Mínimo de votos ajustar
minLineLength Longitud mínima del segmento (px) 50
maxLineGap Máximo número de píxeles vacíos dentro del segmento 10

Para dibujar los segmentos se usa cv2.line directamente (no drawLines):

for seg in segments:
    x1, y1, x2, y2 = seg[0]
    cv2.line(img_copy, (x1, y1), (x2, y2), color, thickness)

Comparativa HoughLines vs HoughLinesP:

Característica HoughLines (clásico) HoughLinesP (probabilístico)
Resultado Rectas infinitas (\(\rho\), \(\theta\)) Segmentos \((x_1,y_1,x_2,y_2)\)
Puntos procesados Todos los bordes Muestra aleatoria
Matriz acumuladora Completa Parcial
Rendimiento Más lento en imágenes grandes Más rápido
Precisión Mayor (procesa todo) Puede variar por el muestreo

HoughLinesP usa internamente algoritmos tipo Monte Carlo para la muestra.

4. Ejemplo práctico — imagen de dados

Con HoughLines + drawLines: se detectan rectas que atraviesan toda la imagen, incluyendo extensiones más allá del borde real del segmento.

Con HoughLinesP + cv2.line: se obtienen exactamente los bordes de los cuadrados de los dados, limitados a los extremos reales del segmento.

Parámetros usados en el ejemplo: rho=1, theta=1°, threshold=57, minLineLength=50, maxLineGap=10.


Actividad 3 — Propuestas

Entrega: lunes 15 de junio, antes de las 21:00. Solo entregar una propuesta, pero se recomienda hacer las tres como preparación para el examen. Si se hace en casa aunque no se entregue, se puede usar en el examen.

Propuesta 1 — Detección de rejilla H/V con Hough

Detectar si una imagen contiene una rejilla formada por líneas aproximadamente horizontales y verticales.

Pipeline: 1. Escala de grises → suavizado (opcional) → Canny. 2. HoughLines → cleanLines. 3. Clasificar líneas en horizontales, verticales e inclinadas (con tolerancia angular). 4. Definir una métrica sencilla para decidir si existe rejilla. 5. Probar con al menos 3 imágenes con rejilla y 3 sin ella (buscarlas el alumno).

Propuesta 2 — Orientación predominante en imagen de bajo contraste

Mejorar el contraste de una imagen muy oscura (fichero incognita.jpg) y determinar la orientación predominante de sus líneas.

Pipeline: 1. Escala de grises → ecualización de histograma (cv2.equalizeHist) → Canny. 2. HoughLines → cleanLines. 3. Clasificar en horizontales, verticales e inclinadas. 4. Métrica sencilla: contar cada tipo y determinar cuál predomina. 5. Mostrar la imagen ecualizada y la imagen con rectas dibujadas. 6. Imprimir uno de los mensajes: "predominan horizontales", "predominan verticales", "predominan inclinadas" o "no hay orientación predominante".

Esta propuesta es más sencilla que la 1 porque la métrica es más directa.

Propuesta 3 — Verificación de diseño de carta (requiere Tema 11)

Detectar el contorno del rombo en un as de rombos y verificar si su área es aproximadamente el 7% del área total de la carta. Necesita detección de contornos (Tema 11, clase semana siguiente). El cuaderno del Tema 11 incluirá un ejemplo con el 9 de rombos.


Material permitido en el examen

  • Cuadernos de clase compartidos en el aula.
  • Actividades realizadas (aunque no se hayan entregado formalmente).
  • No se permite material preparado fuera del aula.
  • Carpeta examen/ en el aula: módulos OpenGL, módulos OpenCV e imágenes.

Preguntas Tipo Examen

  1. ¿Qué diferencia hay entre HoughLines y HoughLinesP? ¿Qué devuelve cada uno?
  2. ¿Por qué HoughLinesP se llama "probabilístico"? ¿Qué implica eso para el resultado?
  3. ¿Para qué sirve el parámetro maxLineGap en HoughLinesP? Pon un ejemplo de su efecto.
  4. ¿Por qué cleanLines tiene una función especial para calcular diferencias angulares (angularDiff)? ¿Qué problema resuelve?
  5. Tienes la salida de HoughLines con una línea [rho=-49, theta=2.87 rad]. ¿Cuáles son el \(\rho\) y \(\theta\) reales de esa recta?
  6. Describe el pipeline completo de la Propuesta 2 desde la imagen original hasta el mensaje de orientación predominante.
  7. ¿Por qué se conserva la imagen original en color si los algoritmos de detección trabajan en escala de grises?