lunes, 11 de febrero de 2013

Detección de Bordes

La actividad para esta entrada es realizar un programa que detecte los bordes en una imagen y los ponga en color blanco y el resto de la imagen la ponga en color negro.

Para poder lograr esto es necesario que la imagen pase por varios procesos hasta que se logre el cometido. Los principales procesos son: a partir de la imagen original(a color) obtener una imagen en escala de grises y a este resultado aplicar una especie de filtro que vuelve la imagen un poco borrosa para que sea más fácil identificar los bordes. 
Ya con la imagen gris y un poco borrosa se procede a identificar los bordes, esto se puede hacer aplican un proceso llamado convolución, que se basa en aplicar una máscara que recorre todos los píxeles buscando variaciones en comparación con los píxeles cercanos.

En caso de que después de aplicar estas técnicas la imagen final no muestre los bordes bien definidos, se puede recurrir a seguir aplicando otras técnicas como normalización para suavizar un poco la imagen y binarización en caso de que la imagen siga teniendo tintes de grises.

En mi caso, según yo, no es necesario aplicar normalización o binarización, porque la imagen muestra bordes bien definidos.

La máscara que utilicé se basa en la obtención del diferencial de gradiente por medio del método del operador de Prewitt o Sobel. Estos operadores calculan las variaciones de intensidad de cada píxel en comparación con otros. 
Para aplicar éstos operadores es necesario multiplicar los valores de cada píxel (yo sólo utilice el primero ya que la imagen al ser gris tiene el mismo valor en los tres espacios) por cada valor de unas matrices pre-establecidad llamadas kernel; en estos casos se usan dos kerneles por operador ya que uno analiza en la dirección de "x" y otro en la dirección "y".

#las matrices
Operadores Sobel
Operadores Prewitt


El resultado de hacer estas operaciones es obtener las variaciones de intensidad o gradientes en "x" y "y". A partir de esto se puede aplicar una formula para obtener el gradiente total en "x" y "y". La formula:



El resultado de pasarla a escala de grises:
Y el código para hacer esto:



El resultado de aplicar el filtro donde la imagen se vuelve borrosa:

Y el código para lograr esto:



El resultado de aplicar las técnicas de los operadores de Prewitt y Sobel:

                           
                                  Operador Prewitt
Operador Sobel













Y el código para esto:



Otras imágenes:
Siguiendo el mismo proceso de las anteriores.



Original -> Escala de Grises -> Borrosa -> Bordes


Los tiempos del procesamiento de las imágenes en la parte de la detección de los bordes van desde 0.40 segundos hasta 0.47 segundos, algo rápido, pero supongo que es por que no se usaron imágenes muy grandes.
_________________________________________________________________________________
Enlaces:
http://en.wikipedia.org/wiki/Prewitt_operator
http://en.wikipedia.org/wiki/Sobel_operator

1 comentario:

  1. No es bueno tener como un valor explícito el 3 en el código, ya que algunas máscaras no son 3x3. Si sigues poniendo constantes así en el código, empezaré a quitar puntos.

    ResponderEliminar