jueves, 25 de abril de 2013

Laboratorio 7

Laboratorio 7 - Detección de agujeros (preprocesamiento)

Hola, esta entrada corresponde a la actividad número 7 del laboratorio de Visión Computacional, consiste en la detección de agujeros por medio de histogramas.


Bien, para la detección de agujeros usé la técnica de histograma lateral, lo primero que realicé fue obtener los histogramas lateral vertical y horizontal, esto lo realicé sumando cada uno de los pixeles por fila y al final se obtenía un total en cada fila; también realicé lo mismo con las columnas, esto se hace con el propósito de obtener las intensidades de pixeles y así por medio de picos (superior o inferior) de intensidades de pixeles se obtienen los posibles agujeros.

A continuación muestro el proceso detallado para realizar lo antes mencionado.

Bien lo primero que tengo es la imagen original (tomada con mi cámara), a esta le pasó por el proceso de escala de grises que habíamos desarrollado en tareas pasadas. 

(Imagen original) 

(Imagen escala de grises)
 
Teniendo la imagen en esacala de grises, sabemos que cada pixel tiene el mismo valor en sus 3 componentes (RGB), de esta manera sumamos cualquiera de ellos a su pixel consecutivo, y así hasta terminar la fila o columna. Si continuamos con el proceso podemos concluir que tendremos 2 listas del tamaño de las dimensiones de la imagen, y cada elemento de la lista será el total de la suma de intensidades de pixeles para una respectiva fila o columna. El código que hace todo este proceso es el siguiente:


Como pueden observar en el código también fui rellenando archivos dat (uno para histograma lateral vertical y otro para horizontal), en los que contiene el resultado de las sumas de cada fila y columna, junto con su correspondiente número de fila/columna, esto con el objetivo de graficar en gnuplot cada uno de los histogramas.

Este es el resultado del archivo "horizontal.dat" usado para graficar el histograma en gnuplot, el valor de la columna 1 son las filas de la imagen (solo puse hasta el 25, pero son mucho más, obviamente depende de las dimensiones de tu imagen); la columna 2 son las sumas de la intensidad de los pixeles.


0 141835
1 141895
2 141890
3 141757
4 141698
5 141803
6 141817
7 141685
8 141859
9 142024
10 141962
11 141760
12 141657
13 141662
14 141812
15 142030
16 141920
17 141918
18 141951
19 142003
20 142015
21 141910
22 141774
23 141748
24 142089
25 142136

Este es el resultado del archivo "vertical.dat" el valor de la columna 1 corresponde a las columnas de la imagen, mientras que el de la columna 2 corresponde  a las sumas de las intensidades de la respectiva columna (obviamente tampoco puse todas, solo las primeras 25).


0 134999
1 134896
2 134912
3 135076
4 135153
5 135076
6 135008
7 135046
8 134931
9 134854
10 135049
11 135276
12 135119
13 134867
14 134904
15 135087
16 134957
17 135071
18 134839
19 134753
20 134903
21 135025
22 135075
23 134918
24 135052

Los resultados ploteados en gnuplot se ven de la siguiente manera:


(Lateral horizontal)


(Lateral vertical)


Después calculé umbrales para poder tomar solo los picos resultantes, los umbrales los obtuve promediando la listas donde contenía todas las sumas de las filas y las columnas, es decir, tengo 2 umbrales; luego filtré los puntos obtenidos para pintar una linea por cada supuesto agujero (pico). El código que realiza este proceso es el siguiente:




El resultado es el siguiente:


Ahora, no siempre tendrán picos inferiores, como los que observan en las imágenes anteriores de gnuplot; esto se dio porque los orificios mostraban una auscencia de luz, por lo tanto era más obscuro que el fondo (imagen blanca). En cambio si en los agujeros hay más luz que en el fondo (osea la hoja) es obvio que los picos de las gráficas de gnuplot serán superiores, es decir, estarán apuntando hacia arriba.


Para comprobar esto yo invertí los colores de la imagen anterior con la ayuda de Kolour paint y realicé la prueba, así se ven los nuevos picos en gnuplot:

(Lateral horizontal)

  
(Lateral vertical)




Prueba 2

Esta vez ya no explico el proceso porque es prácticamente lo mismo.

(Imagen original)

(Lateral horizontal)


(Lateral vertical)


(Trazado de líneas en posibles agujeros)


Una de las tantas impresiones que hice en terminal fueron los puntos donde se intersectan las líneas con los picos o posibles agujeros.


Eso es todo por esta actividad.  
Liga a mi repositorio: https://github.com/eddypre/VisionTriana
Referencias: http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/agujeros.pdf

Cualquier duda o aclaración pueden dejarla en comentarios.

Saludos!

lunes, 22 de abril de 2013

Tarea 6

Tarea 6 - Detección de agujeros

Hola, esta entrada corresponde a la tarea número 6 de la materia de Visión Computacional, consiste en la detección de agujeros por medio de histogramas.


Bien, para la detección de agujeros usé la técnica de histograma lateral, lo primero que realicé fue obtener los histogramas lateral vertical y horizontal, esto lo realicé sumando cada uno de los pixeles por fila y al final se obtenía un total en cada fila; también realicé lo mismo con las columnas, esto se hace con el propósito de obtener las intensidades de pixeles y así por medio de picos (superior o inferior) de intensidades de pixeles se obtienen los posibles agujeros.

A continuación muestro el proceso no tan detallado (eso se verá en el laboratorio).

Bien lo primero que tengo es la imagen original (tomada con mi cámara), a esta le pasó por el proceso de escala de grises que habíamos desarrollado en tareas pasadas. 

(Imagen original) 

(Imagen escala de grises)
 
Teniendo la imagen en esacala de grises, sabemos que cada pixel tiene el mismo valor en sus 3 componentes (RGB), de esta manera sumamos cualquiera de ellos a su pixel consecutivo, y así hasta terminar la fila o columna. Si continuamos con el proceso podemos concluir que tendremos 2 listas del tamaño de las dimensiones de la imagen, y cada elemento de la lista será el total de la suma de intensidades de pixeles para una respectiva fila o columna. El código que hace todo este proceso es el siguiente:


Como pueden observar en el código también fui rellenando archivos dat (uno para histograma lateral vertical y otro para horizontal), en los que contiene el resultado de las sumas de cada fila y columna, junto con su correspondiente número de fila/columna, esto con el objetivo de graficar en gnuplot cada uno de los histogramas.

Este es el resultado del archivo "horizontal.dat" usado para graficar el histograma en gnuplot, el valor de la columna 1 son las filas de la imagen (solo puse hasta el 25, pero son mucho más, obviamente depende de las dimensiones de tu imagen); la columna 2 son las sumas de la intensidad de los pixeles.


0 141835
1 141895
2 141890
3 141757
4 141698
5 141803
6 141817
7 141685
8 141859
9 142024
10 141962
11 141760
12 141657
13 141662
14 141812
15 142030
16 141920
17 141918
18 141951
19 142003
20 142015
21 141910
22 141774
23 141748
24 142089
25 142136

Este es el resultado del archivo "vertical.dat" el valor de la columna 1 corresponde a las columnas de la imagen, mientras que el de la columna 2 corresponde  a las sumas de las intensidades de la respectiva columna (obviamente tampoco puse todas, solo las primeras 25).


0 134999
1 134896
2 134912
3 135076
4 135153
5 135076
6 135008
7 135046
8 134931
9 134854
10 135049
11 135276
12 135119
13 134867
14 134904
15 135087
16 134957
17 135071
18 134839
19 134753
20 134903
21 135025
22 135075
23 134918
24 135052

Los resultados ploteados en gnuplot se ven de la siguiente manera:

(Lateral horizontal)


(Lateral vertical)


Después calculé umbrales para poder tomar solo los picos resultantes, los umbrales los obtuve promediando la listas donde contenía todas las sumas de las filas y las columnas, es decir, tengo 2 umbrales; luego filtré los puntos obtenidos para pintar una linea por cada supuesto agujero (pico). El código que realiza este proceso es el siguiente:




El resultado es el siguiente:


A partir de aquí, sabiendo los puntos en donde se intersectan los picos obtenidos, rellené los posibles agujeros con bfs (de distintas tonalidades de morado), además agregué un punto en amarillo sobre las intersecciones y una etiqueta a cada agujero. También calculé los porcentajes que ocupa cada agujero con respecto a las diemnsiones de toda la imagen. El código que hace este proceso es el siguiente: 



El resultado del proceso es el siguiente:



Prueba 2

Esta vez ya no explico el proceso porque es prácticamente lo mismo.

(Imagen original)

(Lateral horizontal)


(Lateral vertical)


(Trazado de líneas en posibles agujeros)


(Resultado final)

Las tonalidades de morado salieron parecidas, pero sí puse en el código que se obtuvieran valores aleatorios de RGB (con resultados morados) para cada agujero.


Una de las tantas impresiones que hice en terminal fueron los puntos donde se intersectan las líneas con los picos o posibles agujeros.


Eso es todo por esta actividad.  
Liga a mi repositorio: https://github.com/eddypre/VisionTriana
Referencias: http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/agujeros.pdf

Cualquier duda o aclaración pueden dejarla en comentarios.

Saludos!

jueves, 18 de abril de 2013

Laboratorio 6

Laboratorio 6 - Relleno de elipses / círculos

Hola, esta entrada corresponde a la actividad número 6 del laboratorio de Visión Computacional. La actividad consiste en el relleno de elipses y círculos.

Para realizar esta actividad generé elipses con centros y radios (menores y mayores) con valores aleatorios, luego de generar los elipses obtuve las coordenadas de el borde de cada elipse generado, desde 0° hasta 360° mediante las siguiente ecuaciones:

            puntox = centrox + (radiox*cos(angulo))
            puntoy = centroy + (radioy*sin(angulo))

Luego esas coordenadas las uso para recalcar el borde del elipse y usar bfs para rellenar cada uno de los elipses. Seguido de eso pongo puntos en los centros de cada elipse, además de su ID (también en el centro). Al final calculo los porcentajes que ocupa cada elipse con respecto a las dimensiones de la imagen completa.

Bien, al iniciar el programa, tú decides el número de elipses a poner, luego genero los centros y radios aleatoriamente (como lo mencioné anteriormente) de la siguiente manera:


Después mi programa pasa a dibujar cada uno de los elipses con los valores retornados por la función orígenes, esto lo hace mi función dibujar:


 
Además de dibujar los elipses también remarca el contorno de los mismos usando las coordenadas obtenidas del borde (por medio de las ecuaciones antes mencionadas). La función dibujar también rellena mis elipses mandando llamar a bfs, esta misma función marca los centros en color azul y pone las etiquetas con el ID.



Al final calculo los porcentajes de cada elipse con respecto a las dimensiones de la imagen completa:


Ahora les muestro los resultados obtenidos.



Prueba 1.

No se aprecia muy bien el centro de cada elipse, pero si lo marqué con un pixel en azul (se puede corroborar en el código).




Prueba 2.

Pueden notar (en terminal) que paso como parámetro el número de elipses a plasmar. Igual, no se nota el pixel azul central, pero si está presente.





Prueba 3.




Extra.

Bueno, para su deleite, les dejo un arte abstracto que generé pasando un parámetro de 60 elipses. 


Esto es todo por esta actividad.

Liga a mi repositorio: https://github.com/eddypre/VisionTriana

Cualquier duda o aclaración pueden dejarla en comentarios.

Saludos a todos! 

lunes, 8 de abril de 2013

Presentación de proyecto

Presentación de proyecto




Cualquier duda o aclaración pueden dejarla en comentarios.

Saludos!