jueves, 11 de julio de 2013

Detección de Agujeros

Para esta tarea lo que hicimos fue detectar agujeros en una imagen. Como van a ver, es algo bastante simple.

TEORÍA
El método para saber si en una imagen hay un agujero (o agujeros) es el siguiente:

1) Realizar la sumatoria de todos los valores de cada fila y cada columna (por separado cada fila y columna) de la matriz de pixeles. Se podrán presentar dos casos:

  • Si hay agujeros oscuros, la suma de la columna y la suma de la fila donde se encuentra el agujero será un valor bajo (colores relativamente más oscuros)
  • Si hay agujeros claros, la suma de la columna y la suma de la fila donde se encuentra el agujero será un valor alto (colores relativamente más claros)
Por si es confuso, la siguiente imagen puede ayudar a entender de qué hablo al decir que se deben realizar las sumatorias de las filas y columnas:



aquí además podemos suponer que hay un posible agujero claro en la intersección de la última fila y la última columna, ya que la sumatoria de la última fila es 30 y la sumatoria de la última columna es 16, ambas son las mayores en relación a todas las demás.

El número de fila y columna se tomarán como coordenadas de referencia para saber en qué pixel hay un posible agujero.

2) Después de tener las coordenadas donde posiblemente hay un agujero, debemos ubicarnos en el pixel con esas coordenadas y usando una máscara definida por nosotros mismos, realizar una convolución como también lo hicimos en el post anterior. La diferencia aquí es que debemos hacer un promedio de los pixeles vecinos. Este promedio se va a comparar contra un umbral establecido por nosotros mismos:

  • En el caso de agujeros oscuros, el umbral debe ser relativamente bajo. Esto porque si se detecta un agujero, el promedio de la vecindad debe ser oscuro.
  • En el caso de agujeros claros, el umbral debe ser relativamente alto. Esto porque si se detecta un agujero, el promedio de la vecindad debe ser claro.
Para fines de simplicidad, se usará una máscara de 3x3 cuyos valores son únicamente 1's


Como vemos, el promedio del pixel y sus vecinos es relativamente alto (mayor a los demás pixeles).
De aquí podemos deducir que encontramos un agujero. ( Cabe remarcar que en los casos donde el agujero es oscuro las sumatorias y los promedios dan valores relativamente bajos).


CÓDIGO
Lo primero es pasar la imagen a escala de grises tal como sucedió en el post anterior. Lo añadido para este programa es que utilizó una matriz de numpy para almacenar los valores de la imagen para poder trabajar más cómodamente.

Sobre esta matriz, podemos usar el método sum, para obtener las sumatorias de filas y columnas.

Para saber qué pixeles son candidatos a ser agujeros se hace lo siguiente para ambos casos:

  • Para agujeros oscuros, se busca un pixel que se MENOR al pixel anterior a él, y al pixel próximo a él.
  • Para agujeros claros, se busca un pixel que sea MAYOR al pixel anterior a él, y al pixel próximo a él.
Esto nos ayuda a quedarnos sólo con los pixeles más oscuros de la imagen.

El código es el siguiente:
///
///

Cuando hay posibles agujeros, dibujo una línea en la columna y otra línea en la fila del candidato.

//

//
Dentro de este mismo ciclo, me aseguro de que el candidato sea en realidad un agujero mediante el promedio de los vecinos. La subrutina que usé para esto es la siguiente:

//

//

Y es todo. Si el método anterior encuentra un agujero, pinta un pequeño cuadrado sobre él.

Los resultados son los siguientes:

Agujeros oscuros:









Agujeros claros:



Aquí el código completo:

1 comentario:

  1. Lo único malo es que encuentra múltiples agujeros en uno sólo; ocuparía algo de filtrado de resultados. 7 pts.

    ResponderEliminar