Los pasos en que se detectaron los bordes en la imagen fue la siguiente:
- Primero se aplicó una mascara utilizando convolución para aproximar el gradiente tanto en el eje "X" como en el eje "Y".
- Después se normalizaron los colores de la imagen a el rango $\left ( 0, 255 \right )$.
- Se convirtió a escala de grises promediando los 3 canales de colores de la imagen.
- Se aplicó un umbral para convertir la intensidad a dos valores "0" o "255".
Imagen original:
Código:
https://github.com/MaxHernandez/Vision_computacional
Mascaras de convolución
Convolución en las matemáticas es un operador de dos funciones, donde se superpone una función sobre otra.
En el tratamiento de imágenes se podría decir que es el tratamiento de una matriz utilizando otra. Dado que las imágenes se representan como una matriz de colores, es muy común utilizar la convolución para general filtros en las imágenes utilizando una matriz mas pequeña normalmente de 3x3 o 5x5 para tratar la imagen, normalmente esta matriz se le llama kernel o mascara.
La convolución en las imágenes se lleva a cabo superponiendo la matriz kernel sobre la imagen, poniendo el centro del kernel en el centro de un pixel, y después multiplicando esta matriz sobre los valores donde se superponen con la imagen y sumándolos. El valor obtenido se coloca en el pixel en el que estamos trabajando y esto se repite por cada pixel de la imagen.
[imagen obtenida de: "https://developer.apple.com/library/mac/documentation/Performance/Conceptual/vImage/Art/kernel_convolution.jpg"]
Las mascaras que elegí para la detección fueron las mascaras de Sobel:
La mascara de Sobel para el eje-x
$
\begin{bmatrix}
-1 & 0 & 1\\
-2 & 0 & 2\\
-1 & 0 & 2
\end{bmatrix}
$
La mascara de Sobel para el eje-y
$
\begin{bmatrix}
1 & 2 & 1\\
0 & 0 & 0\\
-1 & -2 & 1
\end{bmatrix}
$
Gradiente
Una vez teniendo dos imágenes con el gradiente tanto en el eje-x como el eje-y
simplemente obtuvé el gradiente combinado de la magnitud de ambos utilizando el teorema Pitagoras $c = \sqrt{x^{2}+y^{2}}$ y eso me generó la siguiente imagen:
Normalizando
El normalizado lo hice simplemente buscando en la matriz por el valor mas grande, después de aplicar la normalización a el rango de $\left ( 0, 255 \right )$
lo cual me generó, una versión mas clara de los contornos de la imagen.
Filtro de umbral
Una vez hecho todo esto solamente apliqué un filtro umbral, mandando todos los colores a blanco o negro para obtener una imagen binarizada.
Referencias:
http://angeljohnsy.blogspot.mx/2011/12/sobel-edge-detection.html
http://docs.gimp.org/es/plug-in-convmatrix.html
Había que medir los tiempos. Faltan un par de acentos además, pero no demasiados para llegar a quitar un punto. Aún. 5 pts.
ResponderBorrarMuy bueno max, me sirvio para algo que ando trabajando
ResponderBorrarAmigo me gustaría ver si puedes brindarme tu ayuda para un trabajo que tengo, gracias.
ResponderBorraramigo tengo problema con esta linea:
ResponderBorrarborder_detection(sys.argv[1])
es de tu codigo