La tarea de la clase consistió en hallar líneas horizontales y verticales en una imagen utilizando convolución discreta, máscaras de sobel y Transformada de Hough.
Como podemos ver, los resultados no fueron los más favorables:
Siguiendo el mismo método explicado en la entrada anterior:
y con algunas modificaciones y actualizaciones se obtuvieron mejores resultados:
Pueden ver los cambios hechos en el código incluido al final de la entrada.
Detección de líneas diagonales
Para esta clase el requisito fue detectar líneas en cualquier ángulo posible, en un principio el código estaba preparado para detectar líneas horizontales y verticales solamente, sin embargo, ésto eliminaba la posibilidad de detectar otro tipo de líneas.
Ahora se eliminaron esas condiciones y cambiamos la función atan por atan2, ésto otorga más flexibilidad al momento de tratar valores negativos y divisiones entre cero.
Básicamente lo que hice fue colocar una sola condición para solamente detectar cuando no haya nada en ninguna condición y cualquier otro caso se calcule como un ángulo cualquiera.
Después el ángulo se discretiza en valores entre -10 y 10 para no tener tantas combinaciones diferentes de pares ($\theta, \rho$).
Al final solo se incluyes 3 condiciones de clasificación:
- Si el ángulo es igual a -180, 0 o 180, tenemos una linea horizontal
- Si el ángulo es igual a -90 o 90, tenemos una línea vertical
- Cualquier otro ángulo se trata como línea diagonal
Para limpiar el ruido generado por posibles pixeles solos simplemente se disminuye el numero de pares ($\theta, $rho) candidatos por aquellos que contengan solamente la mayor cantidad de coincidencias.
Resultados
En las siguientes imágenes se ve la interfaz de la aplicación, comparando las imágenes utilizadas con la ubicación de las líneas, el código de colores es el siguiente:
- Rojo: líneas verticales.
- Azul: líneas horizontales.
- Verde: líneas diagonales.
- Gris: no hay nada
Ahora solo se muestra la imagen real y la matriz resultante con la orientación detectada para cada pixel solo con fines demostrativos, no es nada complicado después colorear los pixeles resultantes en la imagen real:
Prueba 1
Prueba 2
Prueba 3
Prueba 4
Un detalle que se encontró fue que a veces es necesario tratar la imagen con algunos filtros, por ejemplo, las últimas 2 imágenes, la que contiene el teorema de pitágoras y la que contiene los rombos, fueron binarizadas antes, ésto debido a la cantidad de ruido generado (pixeles huerfanos).
Esto en realidad no es un problema, si se detecta algo extraño simplemente se aplican los filtros necesarios individualmente y después de pasa a la detección de líneas.
Código
Solo muestro la parte del código relevante y programada para esta entrega, en la liga al repositorio pueden encontrar el todo código mas las actualizaciones.
en la carpeta Tarea 4
Continuidad
Una forma simple de detectar la continuidad de las imágenes es utilizar BFS para recuperar la lista de pixeles que componen cada linea, así como el angulo al que corresponden y el valor de rho.
Después simplemente se almacena la información en los objetos creados.
Prueba 5
Como se puede ver en la imágen de muestra, hay pequeñas lineas incontinuas, lo que se puede hacer es eliminar esas líneas poco continuas o unirlas utilizando un algoritmo para dilatar los pixeles y asi lograr lineas más uniformes.
ififif... ;) 10 pts.
ResponderEliminar