martes, 16 de abril de 2013

Detección de elipses....

La idea era detectar circulos siguiendo el procedimiento:


  • tomar parejas de puntos al azar
  • calcular sus pendientes con los gradientes gx y gy
  • calcular su distancia media
  • y calcular en que punto se cruzan dos lineas que se prolonguen a partir de estos puntos
  • las lineas con más cruces pueden ser parte del elipse
Hay que utilizar máscaras para obtener los gradientes y bfs para los bordes.

y aqui el código hasta donde llegue...



no termine, pero creo que iba por buen camino :/

_________________________________________________________________________________
Referencias
http://pier.guillen.com.mx/algorithms/07-geometricos/07.3-interseccion_recta-recta.htm

jueves, 7 de marzo de 2013

Actividad #5 Laboratorio - Detección de círculos con diferentes tamaños

Esta actividad es lo mismo que la de la clase, lo único diferente es que ahora necesitamos poder detectar círculos con diferentes tamños (radios).

El procedimiento es el mismo, que ya se había mencionado en la entrada anterior:

  • Se calculan los gradientes para cada píxel en la imagen, usando las técnicas empleadas en detección de bordes. Utilizando las máscaras de Sobel, ya que al parecer estas dan mejores resultados para este tipo de trabajo sobre las de Prewitt.

  • Después se calculan los valores de cos y sen de theta utilizando los valores de los gradientes, sin necesariamente calcular el valor del angulo, esto por:


  • Ya con lo anterior se procede a calcular los centros que puede contener la imagen con las siguientes formulas:


Los valores obtenidos en los posibles centros se van almacenan, y se lleva una especie de conteo de que tan frecuente puede ser un centro, los más frecuentes es más posible que sean centros verdaderos, se usa un pequeño umbral para mejorar los resultados y para pintar los círculos solo se checa si se encuentra en la lista de los más frecuentes(que previamente se analizó con el umbral para sacar los no tan frecuentes).

Pero ahora con una variante para poder encontrar diferentes tamaños de círculos, esto añadiendo un ciclo para que evalúe las condiciones anteriores dentro de un rango que el programa toma como parámetro(valor inicial y valor final). 

El código:


Resultado:



Al igual que en la tarea de la clase el resultado no es el esperado ya que solo debería de reconocer los tres círculos más grandes debido a que se usó un rango de 15 a 30. Además de que no pinta exactamente en el centro de los círculos, si no los pinta a un lado.

Enlace a mi git.

_________________________________________________________________________________
Referencias:

martes, 5 de marzo de 2013

Detección de Círculos

La tarea es, dada una imagen hay que encontrar los círculos en ella y marcarlos.

Los pasos para lograr esta actividad son sencillos:

  • Se calculan los gradientes para cada píxel en la imagen, usando las técnicas empleadas en detección de bordes. Utilizando las máscaras de Sobel, ya que al parecer estas dan mejores resultados para este tipo de trabajo sobre las de Prewitt.

  • Después se calculan los valores de cos y sen de theta utilizando los valores de los gradientes, sin necesariamente calcular el valor del angulo, esto por:


  • Ya con lo anterior se procede a calcular los centros que puede contener la imagen con las siguientes formulas:


Los valores obtenidos en los posibles centros se van almacenan, y se lleva una especie de conteo de que tan frecuente puede ser un centro, los más frecuentes es más posible que sean centros verdaderos, se usa un pequeño umbral para mejorar los resultados y para pintar los círculos solo se checa si se encuentra en la lista de los más frecuentes(que previamente se analizó con el umbral para sacar los no tan frecuentes).

El código:


Los resultados:






Los resultados no fueron los esperados ya que no identifica correctamente la posición de los círculos, además por cierta razón identifica todos los círculos, cuando solo debería de identificar uno, el de la esquina inferior derecha que es el cuenta con el radio de 30 que se toma como parámetro al ejecutar el código.

Enlace a mi git.
_________________________________________________________________________________Referencias:


jueves, 21 de febrero de 2013

Actividad 3 Lab : Convex hull

Para esta semana la tarea fue procesar una imagen para obtener el convex hull o envoltura convexa que es la unión de los puntos que se encuentran en el borde o silueta de una figura y que al unirse no cortan la imagen. Se explica mejor en la siguiente imagen:



Para lograr esta actividad, hayvarias técnicas que se pueden seguir como: Graham Scan, Chan´s Algorithm, Jarvis March, Divide and Conquer. Yo utilice Jarvis March.

Lo que hace este algoritmo es tomar un punto e ir buscando el siguiente punto de manera que el nuevo sea el que tenga el mayor o menor(dependiendo de que variación se elija) ángulo formado con respecto al punto anterior.
Ya al momento de realizar esto sobre la imagen, dado que ya tenemos la matriz de los valores de los píxeles es fácil solo checar cuales puntos están más un lado que otros.

Para el código combine el código de la tarea de la clase para detección de formas(bfs) con el algoritmo de jarvis(tome como referencia el algoritmo que viene en wikipedia para ordenar las partes y el código de un tipo, que dejo el link al final).

El código aquí:



El resultado final fue este:



No trabaja correctamente ya que falta que cierre una línea, creo es porque no estoy tomando bien los recorridos de los puntos dentro del convex hull para dibujar las líneas.

Otros intentos fallidos:




El link de mi git: https://github.com/alexgzz/Vision-Computacional
_________________________________________________________________________________
Enlaces:
http://en.wikipedia.org/wiki/Gift_wrapping_algorithm
http://www.exa.unicen.edu.ar/catedras/aydalgo2/docs/Teorica-5.pdf
http://www.pythonware.com/library/pil/handbook/

martes, 19 de febrero de 2013

Detección de formas

Aquí la idea es identificar las diferentes formas en una imagen y colorearlas de diferentes colores(random),  únicamente se pintará gris el fondo de la imagen.

Para llegar a esto es necesario combinar algunas técnicas que ya hemos estado usando como filtros, binarización, detección de bordes...

La imagen con la que trabaja esta parte debe de ser una en la cual los bordes se hayan detectado y diferenciado de lo demás y que éstos se encuentren bien definidos( esto se puede lograr aplicando binarización).

La imagen que utilicé es una ya con bordes detectados y con un proceso de binarización para que estos no tengan discontinuidades.



Para la detección de formas tomé como referencia el código de la Dra. Elisa, y el proceso consiste en recorrer uno a uno los píxeles de la imagen e ir checando el color del píxel, y como la imagen esta en negro y blanco solamente, si es negro(0,0,0) se comienzan a checar sus vecinos hasta encontrar un borde(píxel blanco(255,255,255)) y se pintan de un color al azar.


 


Para colorear en gris el fondo lo que hice fué almacenar los colores(sus valores rgb) de cada píxel que se iban usando en la imagen, posteriormente almacene en una lista cuantas veces se repetía cada uno, tomé el valor más grande de estos, busqué su lugar en esta nueva lista y con el lugar obtenido, solo fuí a la lista de colores y saque el valor que se encontraba en esa posición.(creo que esto se entiende mejor en el código :P)

Aquí pongo el código:


Y aquí otros ejemplos:










Como se puede observar en las últimas imágenes, en algunas zonas no se definen bien los colores y el pintado del fondo gris tiene deficiencias, creo yo que es por la gran cantidad formas y bordes de la imagen, ya que la inicial y la última al ser algo más sencillas se ve mejor el trabajo.

jueves, 14 de febrero de 2013

Avtividad 2 Lab - Ruido "Sal y Pimienta"

Esta actividad consta de dos partes, la primera era generar una especie de ruido llamado Sal y Pimienta(este nombre debido a las pequeñas manchas blancas y negras que se generan) y la segunda parte era tratar de remover este ruido de una imagen.

Para la primera parte, la generación de estos puntos la realicé tomando puntos aleatorios en la imagen y después pinté el píxel eligiendo el color aleatoriamente tomándolo de una lista con cuatro valores diferentes. 

En el programa, se recorren todos los píxeles uno a uno, para la elección del punto se genera un número entero random(entre 0 y 250) y después se verifica si ese número es uno de los tres valores del píxel en cuestión, sí lo es, se escoge un valor aleatoriamente de una lista con valores predeterminados y se utiliza para cambiar el valor del píxel.

Aquí los resultados:



El jugar con algunos parámetros del código, se pueden generar éstas imágenes también:





Y el código que utilicé:



Para la segunda parte, utilicé el código que ya había usado para hacer borrosa las imágenes añadiendo algunas modificaciones, con la idea que ahora debería buscar solo puntos negros y blancos y tratar de difuminarlos, obteniendo los valores de los píxeles adyacentes, sacando un promedio de estos valores y cambiando el valor anterior por este promedio obtenido.

Aquí esta el código:



Y aquí los resultados:


Como se ve, si lo comparamos con la imagen que tiene ruido no se quitaron totalmente las manchas, pero si disminuyó considerablemente o al menos lo suficiente para que se note.