Que tal, para esta entrada se nos encargo hacer un .py que fuera capaz de detectar lineas horizontales y verticales y pintarlas de color rojo.
Para hacer esto se uso el algoritmo de Hough, el cual dice que se recorre toda la imagen pixel por pixel, cuando se detecta un pixel tipo borde, se calcula su RHO y su THETA y se agregan a un lista, si otro pixel vuelve a tener los mismo valores entonces se va acumulando(votando) al final los pixeles mas votados son lo que forman una linea recta.
Para hacer esto se tiene que tomar en cuanta varias cosas, por ejemplo y lo principal, el calculo de RHO y THETA, que los libros nos dicen, mas bien nos muestran la sig. formula.
donde "x" y "y" son la coordenada del pixel actual y THETA es el ángulo que se forma del Punto de origen(tu lo eliges) hasta el pixel actual y se calcula con la siguiente formula.
Con esta formula la teoría nos dice que por cada pixel tendremos finitas lineas rectas que crucen por el pixel actual, pero solo tomaremos en cuenta aquellas rectas que tengan un pixel tipo borde como vecino. Aparte de eso, tendremos que llamar o sumar o votar como lo allás entendido mejor, por los mejores candidatos(pixeles) que formen una recta.
Basta de teoría..... pongamos en practica todo lo anterior.
Lo primero que necesitamos en sacar "gx" y "gy" para poder calcular THETA, para esto usamos los gradrientes obtenidos del operador sobel(o cualquier otra mascara) y el calculo de THETA seria "relativamente fácil" :| y una vez que tengas THETA tendrás que normalizarla, también "relativamente fácil" :|
pero bueno, este es la función que lo hace, y los resultados que arrojan los podrán ver un poco mas abajo de esta entrada.
Resultados....
El programa aun genera mucho ruido y existen pedazos de linea que debería detectar y no lo hace pero en la próxima entrega lo arreglare.
REFERENCIAS
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/2013.html (teoría)
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/histograma.py (código python)
Para hacer esto se uso el algoritmo de Hough, el cual dice que se recorre toda la imagen pixel por pixel, cuando se detecta un pixel tipo borde, se calcula su RHO y su THETA y se agregan a un lista, si otro pixel vuelve a tener los mismo valores entonces se va acumulando(votando) al final los pixeles mas votados son lo que forman una linea recta.
Para hacer esto se tiene que tomar en cuanta varias cosas, por ejemplo y lo principal, el calculo de RHO y THETA, que los libros nos dicen, mas bien nos muestran la sig. formula.
formula para RHO |
donde "x" y "y" son la coordenada del pixel actual y THETA es el ángulo que se forma del Punto de origen(tu lo eliges) hasta el pixel actual y se calcula con la siguiente formula.
formula para THETA |
Basta de teoría..... pongamos en practica todo lo anterior.
Lo primero que necesitamos en sacar "gx" y "gy" para poder calcular THETA, para esto usamos los gradrientes obtenidos del operador sobel(o cualquier otra mascara) y el calculo de THETA seria "relativamente fácil" :| y una vez que tengas THETA tendrás que normalizarla, también "relativamente fácil" :|
pero bueno, este es la función que lo hace, y los resultados que arrojan los podrán ver un poco mas abajo de esta entrada.
Resultados....
Original |
Salida |
El programa aun genera mucho ruido y existen pedazos de linea que debería detectar y no lo hace pero en la próxima entrega lo arreglare.
REFERENCIAS
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/2013.html (teoría)
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/histograma.py (código python)
La función atan2 resuelve muchos de los casos especiales que tienes que manejar. Acabo de aprender que existe esa cosa :P 4 pts.
ResponderEliminar