jueves, 21 de febrero de 2013

Laboratorio 3


Convex hull

Esta vez se trabajara con una imagen que recubre todo el contorno de la imagen, para realizar esto es necesario realizar otras acciones que se realizaron anteriormente, obtención de contorno por medio de convolución y después binarizarla.

Imagen de prueba




El algoritmo usado para obtener esta acción en la imagen llamada convex hull de un set de puntos es conocido por el nombre de Jarvi’s march el cual resulta ser uno de los más sencillos
  • ·Se inicia a un punto extremo dentro de los puntos del contorno, normalmente el que se encuentre más a la izquierda. 
  • En cada paso, se prueba cada punto de los puntos y se encuentra cual hace la vuelta más larga hacia la derecha. Este punto debe estar en el contorno




Imagen de resultado 



En la imagen solo se puede ver que selecciona los punto exteriores de la imagen.

Código:


Aunque el resultado no fue el esperado para la actividad   :(



martes, 19 de febrero de 2013

Clase 2

Detección de formas



Para esta tarea se debe realizar un programa el cual pueda detectar las formas en una imagen cualquiera, las cuales se deben de pintar de diferentes colores tomado en cuenta que la mayor siempre se pintara de color gris, y se colocara un centro de masa en cada figura detectada en la imagen y será etiquetada.

Para poder realizar esta acción es necesario tener ya realizada la parte de la detección de bordes por medio de la convolución, ya realizado con anterioridad, después de realizar la detección de bordes en necesario binarizar la imagen, también realizado anteriormente.

Para esta actividad usaremos el Algoritmo BFS (Breadth First Search) el cual es un algoritmo que se utiliza para encontrar diversas formas, partiendo de la raíz de un nodo y recorriendo todos los vértices. Este algoritmo funciona con una cola esto permite que nunca pase por el mismo nodo dos veces.

Imágenes originales 




A las cuales se les aplico el método de convolución para detectar los bordes de las imágenes





Después de aplicar la detección de los bordes de las imágenes se les aplica la acción de binarización


Para esto es necesario primero tener un coloreo de las figuras, para esto se saca un porcentaje dependiendo la cantidad de píxeles que cubre la figura en la imagen con respecto al total habidos en dicha imagen, ya que se tenga la figura de mayor porcentaje se pintara con un fondo gris mientras que las otras figuras de menor porcentaje se pintaran de diferentes colores.






Después de colorear tenemos que dibujar sus centros de masa la cual obtenemos sumando las coordenadas "x" y "y" para después sacar su promedio, a cada centro de masa se le agrega una etiqueta identificandolo de los demás centros.

Teniendo la primer imagen 8 centros de masa



Teniendo la segunda imagen 13 centros de masa









Código de detección de formas



Mi repositorio

jueves, 14 de febrero de 2013

Lab. Vision Coputacional



Ruido sal y pimienta


Para la segunda tarea de laboratorio de visión computacional consiste en generar una imagen con ruido de tipo sal y pimienta y después quitarle ese ruido para tratar de dejar la imagen en la forma original.

Para lograr esto es necesario recorrer toda la imagen píxel por píxel , al pasar por cada píxel de la  imagen se genera un número aleatorio al cual se le saca el módulo de cualquier número que quieras y si dicho módulo de ese número es  “0”, el píxel se cambiara a blanco(255,255,255) y si es el caso de que es “1” el píxel se cambiara a un color negro(0,0,0).

K = random.randint(0,255)                        
if (K%15 == 0):
                    cambio = 255
                     foto[i,j] = (cambio,cambio,cambio)
                elif(K%15 == 1):
                      cambio = 0
                      foto[i,j] = (cambio,cambio,cambio)

Imagen original













Imagen con ruido




Remover el ruido

Para realizar esta acción también es necesario recorrer toda la imagen píxel por píxel igual que en la vez anterior en busca del píxel que está manchado con el ruido, al encontrar el píxel que cumple la condición se realiza una búsqueda de los valores de los vecinos del píxel seleccionado sacando un promedio de los valores de los cuatro vecinos que tiene el píxel. Aunque no se removió por completo el ruido en la imagen 


Imagen sin ruido







Binarización

Para realizar este efecto en la imagen se necesita cambiar la imagen a un color blanco o negro solamente, partiendo de un valor cualquiera el cual se tomara como referencia para cambiar los valores de los píxeles de la imagen, en caso de que dicho valor sea mayor el píxel se cambia a un color blanco (255,255,255) y si es menor se cambia (0,0,0)
a1 = foto1[i,j]
        rgb = (a1[0] + a1[1] + a1[2])/3                                  
             if rgb < 75:
                      foto1 [i,j] = (0,0,0)
             else:
                      foto1 [i,j] = (255,255,255) 

Imágenes


                                                       






Mi repositorio

Código generador de ruido

Código eliminador


Código de binarizacion

lunes, 11 de febrero de 2013

Tarea clase

Bordes 

Para esta primera tarea es necesario realizar ciertas acciones antes de poder procesar la imagen al estado final de convolucion, las cuales se implementaron en la practica de laboratorio. 

Para este proceso en el cual obtendremos los bordes de una imagen hay varios métodos pero en el caso de esta actividad utilice el operador Sobel que pertenece a las técnicas de gradiente diferencial (DG), dicho método consiste en recorrer la imagen pixel por pixel con una matriz de 3x3 y se obtiene los valores de los productos de la matriz de esa forma se obtiene el valor de la gradiantex y la gradiantey y una gradiante resultante  el cual sera el nuevo valor donde estamos posicionados.


El operador sobel representa una primera aproximación imprecisa del gradiente de la imagen, pero es de calidad suficiente para ser de uso práctico en muchas aplicaciones. Más precisamente, éste operador utiliza sólo valores de intensidad en una región de 3x3 alrededor de cada punto analizado para calcular el gradiente correspondiente, además de que utiliza sólo números enteros para los coeficientes que indican la aproximación del gradiente.

Primero la imagen original: 


Después se paso a escala de grises:

Después se le aplica un filtro:

Aplicando la convolucion:

Binarizacion:


Tiempo de procesamiento de la convolacion:



Otro ejemplo usando la imagen de la practica de laboratorio:












Mi repositorio

Código:

jueves, 7 de febrero de 2013

Lab. Visión computacional

Filtrados: Escala de grises y Umbral(binarizacion)

Esta actividad consiste en cambiar una imagen cualquiera a escala de grises y después cambiarla por medio de binarizacion asignando valores diferentes en los umbrales y cambiar los pixeles a blanco o negro.

Se utilizo para las pruebas la siguiente imagen:

Imagen de prueba



Escala de grises:

Para realizar esto es en la imagen original, se debe obtener principalmente se necesita recorrer toda la imagen de pixel por pixel y obtener los tres valores de "RGB" de cada pixel, dichos valores se necesitan  sumar y después de sumar los tres valores se divide el valor entre 3 y así se podrá ver el cambio.

La función que utilice en mi programa para este procedimiento fue:  

a = foto[i,j]
rgb = (a[0] + a[1] + a[2])/3
foto[i,j] = (rgb, rgb, rgb) 

Imagen obtenida: 

Escala de grises


Umbral(binarizacion)

Para realizar este cambio en la imagen se asigna un valor umbral, en el cual si el pixel seleccionado resulta menor al umbral (75) dicho pixel se pintara o cambiara a color negro (0) y si es el caso de que resulte mayor  a dicho umbral el pixel se pintara o cambiara a blanco (255).

La función que utilice fue:

a1 = foto1[i,j]
rgb = (a1[0] + a1[1] + a1[2])/3
if rgb < 75:
foto1 [i,j] = (0,0,0)
else:
foto1 [i,j] = (255,255,255)


Realice varias pruebas con diferentes valores en el umbral

Umbral  50

Umbral 75

Umbral 100

Umbral 120

Umbral 150

Umbral 200

El código completo: