martes, 19 de febrero de 2013

Diseño Conceptual

Para facilitar el estudio de campo, a continuación describiré métodos de diseño conceptual que se pueda utilizar desde nuestro punto de vista (cómputo obicuo) y usando como ejemplo nuestro proyecto.

Diseño Conceptual

El diseño conceptual está enfocado en comprender los requerimientos de usuario, y por lo tanto es una descripción del sistema propuesto en términos de ideas integradas y conceptos acerca de lo que debería de hacer, como debe comportarse, y como debe verse. Todo esto considerando que debe ser entendible por los usuarios como sea debido.

Principios Guía
  • Discutir y obtener diferentes perspectiva.
Esta fue una de las primeras actividades que se realizaron, ya que primeramente buscamos encontrar una idea para el proyecto. Cada uno aportaba sus diferentes perspectivas acerca de algo que hacía falta o sería bueno para las personas. Al final llegamos a la conclusión de que un Garage Automático sería lo adecuado. Pero no termina ahí, aun decidiendo el tema, las funciones con las que contará, y lo que hará en sí se discutió también, tomando ideas de las diferentes perspectivas de cada uno. 

Algunos creían que contar con una cámara de seguridad que reportará anormalidades a alguna red social sería innovadora y aportaría al proyecto, otros que ésto sería un agregado innecesario debido a que es probable que las personas no tengan redes sociales. Otra idea debatida fue la idea de incluir códigos QR para abrir el Garage, algo innovador pero después concluimos que sería ineficiente ya que el usuario debería de bajarse del auto para que el lector pueda tomar buena vista de el código.

Al final, las ideas que se acepten  e implementen, serán en base a la retroalimentación del usuario.
  • Prototipado
Al momento de realizar éste post, no hemos discutido ninguna forma de prototipado que podamos mostrar a los usuarios para dar una buena idea del funcionamiento del sistema. Debido a que también tenemos diferentes ideas, un prototipado por idea sería buena idea ("para tener una BUENA idea, obtén muchas ideas"). Además incluiremos un costo aproximado de la fabricación de cada uno.

Hay que notar que hablamos de prototipos de baja fidelidad, en sí diseños dibujados que representen correctamente los elementos y la interacción que se hace con ellos. 
    • Prototipo 1: Garage con Apertura mediante RFID
    • Prototipo 2: Garage con Apertura mediante código QR
    • Prototipo 3 Garage con apertura mediante Smartphone:
  • Perspectivas
Modo de Interacción. 

Descripción: Se refiere a como el usuario invoca las acciones al interactuar con el dispositivo.

Ejemplo con el proyecto:

En este caso sería que es lo que tiene que hacer para que el Garage se abra. Dependiendo del tipo de prototipo.
    • Garage RFID: No existe real interacción entre el usuario y el dispositivo. El dispositivo colocado en el Garage, detectaría la proximidad del automóvil con el RFID tag posicionado en algún lugar en el mismo, y se abriría automáticamente.
    • Garage QR: Existen dos formas de interacción dependiendo del diseño del lector de QR. Si el lector es posicionado sobre el Garage, y el código se pega en el vidrio frontal del automóvil, no existiría ningún tipo de interacción además de colocar el código en el vidrio para que el dispositivo haga lo demás. Si el lector es posicionado en algún otro lugar, como por ejemplo al lado del Garage, el usuario debería mostrar el código QR al lector para poder abrir el Garage.
    • Garage Smartphone: El usuario realiza una interacción con el sistema al tener que usar la aplicación diseñada por nosotros para enviar la señal de apertura a la puerta.
Metáfora de la Interfaz

Descripción: Para mejor comprensión del usuario, se combina el conocimiento familiar de los usuarios con los nuevos conceptos del proyecto, para ayudarlos a entender el sistema:

Ejemplo con el proyecto:

Es muy probable que los usuarios no conozcan términos como RFID, código QR y quizás hasta Redes Sociales, por lo cuál, para facilidad de ellos, los prototipos se explicarán de la siguiente manera:
    • Garage RFID: Garage que se abre automáticamente al aproximarse.
    • Garage QR: Garage que se abre al mostrar un código similar al código de barras a una cámara.
    • Garage Smartphone. Garage que se abre al presionar un botón en el celular.
  • Expandiendo el diseño conceptual
Descripción: Para poder explicar mejor el dispositivo, y tener un mejor panorama, se explican las funciones que realiza, como interactúan unas con otras y la información que se necesita para que funcionen.

Ejemplo con el proyecto:

¿Qué funciones realizará el producto (como se dividen las tareas)?
    • Abrir la puerta de Garage mediante un método automático o requiriendo la validación del usuario de alguna manera. 
    • Informar de actividad sospechosa al correo del usuario
¿Como se relacionan las funciones una a otras?
    • Las funciones se realizan de manera secuencial. El usuario llega al Garage, y ya sea que se abra automáticamente o mediante la validación del usuario, se envía una señal al dispositivo localizado sobre la puerta para abrirla. 
    • Lo anterior es independiente a informar al usuario de actividad sospechosa, que se realiza todo el tiempo restante.
¿Qué información se necesita?
    • Para el prototipo de códigos QR, se necesita un código QR impreso generado por un servicio web propio. 
    • Para el prototipo RFID, se necesita un RFID tag colocado en algún lugar del automóvil para que el dispositivo lo detecte.
    • Para el prototipo con Smartphone, se necesita la aplicación que esté ligada a la puerta de Garage correspondiente.
    • Para la función extra de notificaciones de actividad sospechosa se necesita proporcionar un correo electrónico al cual se enviará la información de la actividad detectada y datos de la red local para poder conectarse y enviar esa información.
  • Escenarios
Descripción: Ayudan a comprender el contexto y la situación en la que se usa el sistema.

Ejemplo con el proyecto:

Existen diferentes escenarios posibles de uso que tenemos en mente
  1. Apertura local del garage. El usuario llega a su hogar, se posiciona enfrente del garage, y realiza alguna actividad de las antes mencionadas para abrirlo. 
  2. Apertura remota del garage. Otra de las ideas es que se pueda abrir remotamente a través de Internet, para poder permitir la entrada a familiares o terceros. En este caso el usuario entra a un servicio web, o se conecta a través de una aplicación de Smartphone y realiza una acción en la aplicación que envía una señal a través de Internet para abrir la puerta
  3. Notificaciones: Un automóvil se estaciona frente al Garage. La cámara lo detecta y envía una notificación cada cierto tiempo informando de ello.
Referencias:

domingo, 17 de febrero de 2013

Tarea 2: Detección de Formas

Link al repositorio: https://github.com/synnick/viscomp

Para la detección de formas, lo solicitado fue lo siguiente:
  • Agregar una rutina que detecta todos los componentes conexos separados por bordes.
  • El componente más grande debe suponerse ser el fondo, y colorearse gris.
  • Los demás dibujos se les asignan colores fuertes. Colocando el borde en blanco y un punto negro en el centro indicando el centro de masa.
  • A un lado del centro de masa, se agrega una etiqueta ID del componente.
  • El programa debe imprimir un listado con los porcentajes de la parte del total que abarca un componente y su ID.
La imagen utilizada, por su contenido en formas sencillas es la siguiente:


Previo a la detección de formas

Antes de iniciar la detección de formas, lo primero es utilizar las rutinas programadas en el post anterior para lo detección de contornos. Esto para poder determinar las separaciones que existen entre componentes conexos y además diferenciar contornos de la figura en sí. 

Para detectar los contornos se realizaron los siguientes pasos:
  • Conversión de imagen a escala de grises.
  • Convolución de la imagen con la siguiente máscara:
  • Binarización de la imagen.

Con lo anterior la imagen se prepara para poder detectar los componentes en la misma, quedando así.


Rutina que detecta los componentes conexos

BFS

Para crear esta rutina, lo primero que hice fue programar un BFS iterativo que pudiera colorear, a partir de un pixel inicial, todos sus vecinos que comparten el mismo color. Esto lo hice en base a un pseudo código visto en clase y al código utilizado por la Dra. para el ejemplo con texto ASCII. 

El funcionamiento es el siguiente. Tenemos un punto de inicio en las coordenadas x, y. En base a ese punto, guardamos el valor de su pixel en una variable, para así poder recorrer todos los pixeles que son del mismo color y "marcarlos" de un color determinado. Mientras se recorren estos pixeles, contamos la cantidad de los mismos para después poder calcular el promedio que tiene esa figura con respecto al total de pixeles. 

Es necesario recalcar que solo se recorren los pixeles blancos, ignorando los negros para que los birdes sirvan efectivamente como limitantes del recorrido.

Un ejemplo del uso de DFS para pintar un contenido en un simple círculo:

Original

Iniciando en (0, 0)                        Iniciando en (300, 250)                    Iniciando en (180, 180)

Código de BFS:


Ahora, volviendo a la imagen original, se recorrerá cada pixel de la imagen binarizada, aplicando BFS a cada pixel negro que se encuentre y coloreando sus vecinos con un color aleatorio. Esto no significa que se correrá una vez la función para cada pixel, ya que cuando se recorra bfs desde un determinado pixel, se marcarán sus vecinos y ya no será necesario volver a usar bfs en ellos. Cada que se termine un recorrido, se asumirá que se pinto una figura completa, y se guardarán sus coordenadas x y y en listas por si se necesitan para calcular el centro de masa. Además se guarda su total de pixeles para poder obtener el promedio y sus respectivos ID.

Después de calcular todo lo anterior, aún tenemos que identificar el fondo. Se nos pidió asumir que la figura con mayor porcentaje de pixeles es el fondo, por lo cual se  hace uso de los promedios para encontrar la mayor y repintarla, ahora en gris. Lo restante es calcular los centros de masa para cada figura e imprimir los promedios.

Los centros de masa son calculados en base a las listas x, y mencionadas anteriormente y promediando cada unos para obtener el "centroide". Estos son desplegados como labels en Tkinter para poder etiquetar las figuras.

Resultado:



Se localizaron 5 objetos (etiquetados del 0 al 4). El objeto 0 es la orilla naranja, el objeto 1 es el círculo gris, el objeto 2 es la boca verde, el objeto 3 es el círculo celeste y el objeto 4 es el círculo azul. Las etiquetas 0 y 1 se superponen debido a que el centro de masa del círculo y el centro de masa del rectángulo naranja son similares. Las etiquetas como se mencionó anteriormente son colocadas como labels en Tkinter.

Los porcentajes aparecen del lado derecho de la captura, mostrando la figura 0 con un 28.04%, el círculo  siendo el mayor con un 58.30%, la boca con un 2.87% y los ojos con un 4.25% cada uno.

Por el tamaño del círculo, se asume que es el fondo, aunque en este caso no lo es.

La imagen de resultado sin las etiquetas pero con los centros de masa marcados como puntos negros:


Código de Detección de Componentes:


Otras imagenes con la detección de componentes en funcionamiento:

             Original                                    Previo a la Detección                    Formas Detectadas


 

Etiquetas y promedios


Original

        Previo a la Detección                                                  Formas Detectadas
,                    


Etiquetas y promedios


sábado, 16 de febrero de 2013

Laboratorio 3: Mapa de Cobertura de Redes

Para esta Tarea se nos pidió realizar un mapa de cobertura de las redes en un área determinada usando Google Maps.

Para poder realizar éste mapa, necesitamos algunas cosas como:
  • Puntos donde se localizan los routers en el área (Aproximados en este caso).
  • Potencia de Señal (Signal Strength) desde un punto donde se miden las coberturas.
La potencia de señal, podemos obtenerla de diferentes maneras, la que escogí yo fue utilizando el comando iwlist de Linux para recolectar información sobre las redes alrededor de mi computadora.

Esto nos da una impresión con muchos datos como se muestra.


La parte que nos interesa en general es la de Quality, que sería la calidad de la señal que tenemos donde realizamos la medida. Para eliminar toda la información innecesaria y conservar solo lo que me interesa, escribí un pequeño script en Python que ejecuta iwlist para una cierta tarjeta de red, hasta conseguir información de una cantidad determinada de routers. 



En el área donde realicé esto había más de 5 redes, por lo tanto ejecutando el script para obtener información de 5 redes se obtiene lo siguiente.


Nota: También se puede obtener el nombre del router y la MAC Address, pero debido a que no me pertenecen, elimine la lectura de dicha información del script para esta captura.

La señal con más poder es 70/70, es decir que al momento de la lectura tal router era el más cercano.

Lo siguiente es aproximar las posiciones donde se encuentran en Google Maps. La forma que utilicé para mejorar un poco la aproximación es caminar con una aplicación que mida en tiempo real la potencia de las señales alrededor. Así, podia moverme investigando hacia donde se hacia más fuerte una señal, y marcar un punto en esa área en Google Maps.

Teniendo toda esta información ya solo guardamos las coordenadas de cada router en una lista, y además algún color identificador de esa red en otra, y en una última la potencia de la señal que obtuvimos usando iwlist

Usando HTML y Javascript, creamos una pequeña aplicación que se centre alrededor de el área de cobertura, y dibujamos círculos alrededor de las coordenadas aproximadas de los routers. Para ilustrar la potencia de su señal, usamos el valor que obtuvimos al medir la potencia (valores desde 0/70 hasta 70/70, es decir de 0 a 1), y lo colocamos como la opacidad del círculo.

Aquí una captura del mapa:


La imagen oscura al fondo es la red más cercana (a la cual estaba conectado), las demás son redes vecinas. Como se puede observar la red verde de la derecha prácticamente no tiene color interno, lo que significa que su señal era casi nula. Las demás redes cercanas su opacidad es proporcional a la distancia y potencia de señal.

viernes, 15 de febrero de 2013

Tarea 3: Impersonation Attack (Ataque de Suplantación)

Para la Tarea 3 de Redes de Telecomunicaciones, escogí el Impersonation Attack (Ataque de Suplantación)

Antes que nada quiero establecer que todo lo siguiente se realizó sobre mi propia red y nunca afectando a terceros.

Para entender como funciona el ataque de suplantación debemos conocer dos conceptos: MAC Address y Filtrado MAC.

MAC Address

La MAC Address (Media Access Control) o dirección MAC es un número que identifica el o los adaptadores de red instalados en una computadora o dispositivo.

Normalmente las direcciones MAC son asignadas por el fabricante de las tarjetas de interface de red, y son almacenadas en su hardware.

El formato estándar para las direcciones MAC consiste en seis grupos de dos dígitos hexadecimales, separados por guónes o dos puntos, en orden de transmisión. Por ejemplo:

01-23-45-67-89-ab ó 01:23:45:67:89:ab

Para conocer la dirección MAC de nuestras tarjetas de redes, podemos hacer uso del comando:

 ifconfig nombredeinterface

Por ejemplo, para conocer la dirección MAC de mi tarjeta de red inalambrica:


MAC Filtering

El filtrado MAC es una de la posibilidades para permitir que solo una cantidad autorizada de usuarios pueda acceder a una red inalámbrica. 

Los routers normalmente pueden configurarse para realizar éste tipo de función en alguna de sus opciones. Más adelante explicaré como se hace eso en mi router 2wire.

Simulación de Uso del Ataque de Suplantación:

Imaginemos esta situación:

"Estamos en Starbucks disfrutando de un delicioso café, trabajando en nuestra laptop, y en un momento nos enteramos de que nos han quitado el Internet. No sabemos que ocurrió, y al preguntar nos dicen que hay un tiempo límite para cada persona en el cual puedes estar conectado. Al tener mucho trabajo por hacer, buscas opciones para conseguir Internet"

Nota: Para simular esta situación, nombré mi router "starbucks", y quité la protección del mismo para no requerir password. 

Ahora, inicialmente el usuario estaba conectado, pero en un momento a otro se desconectó el internet sin aviso previo.

La razón de ésto, puede ser que la dirección MAC del cliente haya sido bloqueada por un filtro que agrega las direcciones MAC que tienen cierto tiempo conectadas. En el caso de mi router, esto se puede acceder en sus configuraciones ingresando a http://gateway.2wire.net/xslt? o /home desde cualquier navegador.

Ahí, en las configuraciones inalámbricas se puede encontrar el Filtrado MAC para bloquear a ciertos usuarios. La pantalla en mi caso se ve de la siguiente manera:



Podemos bloquear usuarios con un cierto hostname que ya se hayan conectado en algún momento, o directamente con su dirección MAC. Ahora, simularemos que el sistema de Starbucks bloqueó al usuario synnick:


El sistema detecta su hostname y lo coloca en la lista de bloqueados. Esta persona por lo tanto no podrá acceder a la red, y le aparecerá un mensaje de desconexión. Si este fuera el caso, una solución podría ser hacer MAC Spoofing.

MAC Spoofing

Lo que se necesita hacer es lo llamado MAC Spoofing. Esto requiere cambiar nuestra dirección MAC por  cualquiera, pero en este caso haremos algo un poco más avanzado. Cambiaremos nuestra dirección MAC por la de otro cliente (por esto la suplantación). 

Para probar esto, conecté mi celular a la misma red, como se puede ver:


Nota: Para seguir con la simulación, asumamos que la persona que tiene un celular conectado todavía tiene tiempo restante de uso de Internet, y por lo tanto no está bloqueado.

El objetivo ahora es, encontrar la dirección MAC del cliente que está conectado con su celular, y reemplazar nuestra dirección con la suya. Esto no es así de simple, ya que el router podría ver que la dirección ya está asignada. Por lo tanto, tenemos que primero desautentificar el cliente antes de intentar conectarnos nosotros mismos. Para realizar todo ésto haré uso de Aircrack-ng.

Encontrando la dirección MAC del cliente

No entraré mucho a detalle sobre el funcionamiento de Aircrack-ng, si se desea comprender más, existen excelentes guías del funcionamiento para comprenderlo mejor.

Primero colocamos la tarjeta en modo monitor. Lo siguiente es sniffear o monitorear las conexiones del router al que deseamos conectarnos. Como necesitamos la dirección MAC del router para poder sniffear sus conexiones, utilizamos el comando iwlist wlan0 scan. Esto nos da una salida así:


Localizamos la dirección MAC del router y la guardamos. Esta la usaremos con el siguiente comando para sniffear conexiones con clientes.

airodump-ng -c 11 --bssid 00:1F:B3:93:DF:19 mon0


Localizamos la dirección MAC del cliente entre los datos que aparecen en la pantalla, y la anotamos. Esta dirección es la que usaremos para suplantar. Para cambiar nuestra dirección MAC existen múltiples opciones, la más sencilla es con los siguientes comandos:

ifconfig wlan0 down
ifconfig wlan0 hw ether C8:AA:21:75:BE:EE
ifconfig wlan0 up

Luego podemos checar que haya cambiado:



Ya tenemos la dirección MAC cambiada por la que vamos a suplantar, pero aún falta el paso final, desconectar al cliente original. Para hacerlo, hacemos uso de Aircrack-ng de nuevo para enviar intentos de desautentificación hacia la dirección MAC del cliente, usando el siguiente comando:

aireplay-ng -0 5 -a 00:1F:B3:93:DF:19 -c C8:AA:21:75:BE:EE mon0



Esto desautentificará al cliente, provocando la desconexión. Mientras esto ocurre debemos conectarnos nosotros mismos antes que el cliente, al realizarlo exitosamente el otro cliente no podrá conectarse, y nosotros tendremos Internet.


En la imagen anterior se observa que estamos conectados con la dirección MAC del cliente.

Referencias:

jueves, 14 de febrero de 2013

Laboratorio 2: Ruido Sal y Pimienta, Detección de Bordes

Link al repositorio: https://github.com/synnick/viscomp

Ruido Sal y Pimienta

El ruido sal y pimienta consiste en generar ruido aleatorio en una imagen, en forma de puntos blancos y negros con cierta intensidad, por esto el nombre. 

La forma en la que lo generé, fue obteniendo primero dos números aleatorios x, y. Estos números deben ser, x de tamaño 0 < x < largo, y de tamaño 0 < y < ancho. Estos números serán las coordenadas donde se colocará el ruido. Para determinar si será un punto blanco ("sal") o un punto negro("pimienta"), se obtiene un tercer número aleatorio entre 0 y 1, para decidir de que color será el punto en cuestión. 

Todo lo anterior se repite un número de veces, que depende de la intensidad que se da como parámetro. La intensidad es un porcentaje de la imagen(en pixeles) al cual se colocará ruido, redondeado para poder tener pixeles enteros. Además, los pixeles no serán completamente negros ni completamente blancos, sino contarán con una "polarización", que igualmente será un porcentaje de que tan blanco o negro es el punto. Entre más cercano al 100, más cercano a negro y blanco. 

Aquí algunos ejemplos de imagenes con ruido sal y pimienta, utilizando una intensidad de 0.5 y una polarización de 30 (pixeles blancos 255 a 225, pixeles negros de 0 a 30):




Eliminación de Ruido Sal y Pimienta

Para eliminar el ruido en la forma más básica (puntos totalmente negros o totalmente blancos) basta con recorrer la imagen y buscar dichos puntos. Al localizarlos, se obtiene un promedio de sus vecinos, y el ruido queda eliminado. Esto debe aplicarse solamente en los pixeles localizados, ya que al no ser así, estaríamos haciendo difusa la imagen.

Ahora, tomando en cuenta que los pixeles contarán con una polarización como se mencionó anteriormente, debemos de poder buscar dicha polarización añadiendo un umbral de decisión que nos pueda decir de que rango tomaremos como pixel sal a un punto blanco y de que rango tomaremos como pimienta a un punto negro, para aplicarles promedio. En base a esto podremos arreglar la imagen(o no) dependiendo del umbral escogido.

Las imagenes anteriores, con el ruido parcialmente eliminado, usando la misma polarización como umbral:



Es posible que en algunas imagenes queden rastros del ruido sal y pimienta(sobre todo cuando el ruido aparece muy cerca uno a otro), pero en sí la eliminación del ruido es aceptable.



Detección de bordes

En la materia, utilizamos una forma para detectar los bordes usando una matriz de convolución sobre una imagen determinada. En caso del laboratorio, se utilizó un método completamente diferente, que se menciona a continuación. La imagen usada fue:
Diferencia entre imagen original y difusa


Para poder obtener los bordes de una imagen, podemos obtener una imagen difusa usando el filtro de promedio usado en el post anterior de laboratorio y la imagen original. Primero obtenemos una diferencia entre la imagen origina y la difusa, es decir, restamos el valor del pixel en las coordenadas i, j de la  imagen original, menos el valor del pixel en las coordenadas i, j de la imagen difusa.

Esto debe hacer que solo algunos bordes queden visibles. La razón por la cual esto ocurre es que los bordes de los objetos es donde más cambios hay, y al hacerlos difusos este cambio se hace un poco más notable. Por ejemplo si tenemos una imagen de una silueta de una persona, y detrás un fondo de diferentes colores, al promediar la imagen para hacerla difusa, los bordes resultaran con los promedios más diferentes a los de la silueta y el fondo.

Esto se puede observar en la siguiente imagen:

Normalizado

Al normalizar la imagen, colocamos los valores de las pixeles dentro de un rango entre su pixel mayor y su pixel menor. Esto nos da un contorno de la imagen:



Binarizado

Al final, realizamos un corte, colocando los pixeles que no son negros(0) en blancos(1), para poder resaltar los bordes. Si queremos, podemos entonces colocar los pixeles que encontramos blancos aquí, dentro de la imagen original como rojos o algún otro color, para mostrar si en verdad se detectaron bordes o que se encontró. El binarizado puede observarse a continuación:


miércoles, 13 de febrero de 2013

Tarea 1: Máscaras y Detección de Bordes

Link al repositorio: https://github.com/synnick/viscomp

Convolución Discreta 2D

Para poder aplicar una máscara de convolución a una matriz de los pixeles de una imagen, primero decidí programar dicha operación para una matriz simple, comprobando que el funcionamiento fuera el correcto. El ejemplo que utilicé fue:


La idea es centrarse en un pixel determinado, y a partir de ese "empalmar" la máscara sobre el mismo, y realizar una suma de las multiplicaciones de cada par de celdas que se empalman, incluyendo la cual está centrada. 


De no existir algún valor al empalmarse(por ejemplo en la imagen anterior, debido a que es una esquina no existen valores para multiplicar el -1, -2, -1, 0 y 1) se toma como 0 la operación y se suman solamente los existentes.

El resultado de dicha suma se guarda en una tercera matriz, es importante recordar esto ya que estamos haciendo estos cálculos con los valores originales, no actualizando la matriz original.

La matriz resultante debe ser la siguiente:

El código que hace lo anterior es el siguiente:





Aplicación de máscara para detección de bordes

Ya con la correcta implementación de la convolución lo siguiente es usarla en una imagen, aplicando una máscara. Para esto solo se carga una imagen en una matriz, se convierte en escala de grises y después se le aplica alguna mascara a elección a cada elemento de la matriz de pixeles. Para mejorar los resultados, es decir, que no aparezcan líneas discontinuas visibles, ayuda usar un filtro promedio después de convertir los pixeles a escala de grises.

A continuación mostraré los resultados de aplicar diferentes máscaras a 3 pares de imagenes.

Máscara



             Imagen Original                                                             Imagen Nueva


Conclusión: La máscara marca correctamente los bordes en imagenes con poco ruido como comics. Pero en imagenes mas complejas los bordes son poco definidos y aparece mucha interferencia.



Máscara (Sobel para líneas horizontales)


              Imagen Original                                                           Imagen Nueva
                          


                                                      
                                                                  

Conclusión: La máscara se comporta de buena manera para líneas horizontales, marcándolas de buena forma, las líneas verticales podrían ser mejores.

Máscara (Sobel para líneas verticales)



              Imagen Original                                                           Imagen Nueva


                                                  

                     
     
Conclusión: Como la anterior, pero ahora la máscara encuentra de forma excelente las líneas verticales, ignorando algunas partes de las horizontales, por lo cual sería deseable combinarlas.

Máscara (Sobel vertical + horizontal + Prewitt 45°)
(Nota: Se suman las matrices para combinar los resultados)

              Imagen Original                                                           Imagen Nueva

           
               
Conclusión: La detección de bordes se comporta excelente en imagenes con dibujos y comics, encontrando casi la totalidad de bordes, cortándose en algunas partes. La imagen mas compleja, siendo la de en medio cuenta con mucho ruido por lo cual la detección falla en algunas partes.

Código de la aplicación de máscaras:

Tiempos de Ejecución

Imagen 1:  53.3538572232 segundos

Imagen 2: 105.186025143 segundos

Imagen 3: 71.6054358482 segundos

Tiempos horribles, sí. Veré la manera de mejorarlos en un futuro cercano.


*FIXED*

El problema al parecer era el uso de una matriz de numpy para la máscara. Al cambiarla por listas de python los resultados mejoraron considerablemente, siendo los siguientes:

Imagen 1: 4.64621206919

Imagen 2: 9.65786719322

Imagen 3: 6.70177864234

Ahora los tiempos son bastante aceptables, tardando tan solo 4.6 segundos en la imagen mas pequeña(468x375), 6.7 segundos en la imagen mediana(364x600) y 9.6 segundos en la mas grande(713x500).