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 porHoughLines(en polares) sobre una imagen, extendiéndolas con el parámetrolimits.cleanLines: elimina líneas duplicadas/similares de la salida deHoughLinesusando tolerancias en \(\rho\) y \(\theta\). ⚠️ EXAMEN- Convenio OpenCV vs convenio propio:
cleanLinesdeshace 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) ymaxLineGap(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
- ¿Qué diferencia hay entre
HoughLinesyHoughLinesP? ¿Qué devuelve cada uno? - ¿Por qué
HoughLinesPse llama "probabilístico"? ¿Qué implica eso para el resultado? - ¿Para qué sirve el parámetro
maxLineGapenHoughLinesP? Pon un ejemplo de su efecto. - ¿Por qué
cleanLinestiene una función especial para calcular diferencias angulares (angularDiff)? ¿Qué problema resuelve? - Tienes la salida de
HoughLinescon una línea[rho=-49, theta=2.87 rad]. ¿Cuáles son el \(\rho\) y \(\theta\) reales de esa recta? - Describe el pipeline completo de la Propuesta 2 desde la imagen original hasta el mensaje de orientación predominante.
- ¿Por qué se conserva la imagen original en color si los algoritmos de detección trabajan en escala de grises?