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!

2 comentarios: