Tarea 2 - Detección de Figuras
Hola, la siguiente actividad de la clase de visión computacional consiste en implementar una subrutina del algoritmo BFS, para después detectar las distintas figuras presentes en una imagen, así como los centros de masa.
El requisito para realizar esta actividad es tener una imagen con los bordes detectados, y también tiene que estar binarizada (es lo correspondiente a la tarea 1, antes entregada).
Mediante el algoritmo BFS encontramos las distintas figuras que componen la imagen, esto recorriendo los pixeles totales de la imagen, el algoritmo parte de un nodo raiz y luego se van recorriendo los nodos vecinos, introduciendo en una cola.
Como ya tenemos la imagen con bordes y binarizada el algoritmo va a estar delimitado por los rangos que corresponden a las lineas blancas (los bordes), al ir recorriendo los pixeles de una imagen lo voy pintando con un color random, dejando siempre el fondo (parte de mayor porcentaje de la imagen) en color gris (requerido en la tarea).
Este mismo proceso es para detectar todos los objetos o figuras de la imagen. Así que en cada pixel negro de la imagen se buscará la figura, siempre respetando los contornos o los bordes de cada figura.
A continuación la subrutina bfs():
#Implelementacion de bfs *************************************************** #*************************************************************************** def bfs(im, origen, color): n = 0 pixel = im.load() width, height = im.size col = [] xsum = [] ysum = [] col.append(origen) original = pixel[origen] largo = len(col) while largo > 0: (x, y) = col.pop(0) actual = pixel[x, y] if actual == original or actual == color: for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: i, j = (x + dx, y + dy) if i >= 0 and i < width and j >= 0 and j < height: contenido = pixel[i, j] if contenido == original: pixel[i, j] = color xsum.append(i) ysum.append(j) n += 1 col.append((i, j)) #im.save('bla01.jpg') return n, xsum, ysum # el regreso para la funcion formas #Para clasificar los objetos********************************************** #***************************************************************************** #*************************************************************************
Un video muy bueno que ayuda a programar el BFS
Ahora para pintar objetos, centros de masa y porcentajes:
#Para clasificar los objetos********************************************** #***************************************************************************** #************************************************************************* def formas(): im = Image.open("meh5.jpg") #Imagen con bordes y binarizada width, height = im.size total = width * height porcentajes = [] centro = [] corr = 0 ##Solo para corroborar porcentajes conteo = 0 pixel = im.load() temp = [] colorsR = [] #Para guardar colores R colorsG = [] #Para guardar colores G colorsB = [] #Para guardar colores B conteoColores = 0 for i in range(width): #Recorriendo imagen for j in range(height): #Recorriendo imagen if pixel[i, j] == (0, 0, 0): #Ir pintando pixeles (negros obviamente) r, g, b = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) #Asignando pixeles random n, x, y = bfs(im,(i,j),(r,g,b)) ptemp = float(n)/float(total) * 100.0 #Obteniendo porcentajes if ptemp > 0.1: centro.append((sum(x) / len(x), sum(y) / len(y))) #Localizando centros porcentajes.append([ptemp, (r, g, b)]) conteo += 1 else: temp.append((x, y)) fondo = porcentajes.index(max(porcentajes)) color = porcentajes[fondo][1] for i in range(width): for j in range(height): if pixel[i, j] == color: pixel[i, j] = (150, 150, 150) for i in range(len(centro)): if i == fondo: pixel[centro[i]] = (255, 0, 0) #Para poner centros de masa #Aqui va lo de las tags, proximamente en Tkinter o Pygame else: pixel[centro[i]] = (0, 0, 0) im.save('bla02.jpg') #Imagen definitiva conteo = 0 for ptemp in porcentajes: print "Porcentaje de figura %s: %.2f"%(conteo, ptemp[0]) conteo = conteo+ 1 corr = ptemp[0] + corr #print "Corroborando porcentaje: ", corr # FIN ********************************************************************
Resultados obtenidos:
Para realizar las pruebas tuve que poner imágenes en las que su contorno estuviera bien definido, ya que con algunas pruebas simplemente no era posible detectar las figuras que componian la imagen.
1) Prueba 1
(Hacer click sobre la imagen para ampliar)
Procesos de conversión en GIF:
2) Prueba 2
(Hacer click sobre la imagen para ampliar)
Procesos de conversión en GIF:
3) Prueba 3
(Hacer click sobre la imagen para ampliar)
Procesos de conversión en GIF:
Para obtener GIF's, por si les interesa: http://andalinux.wordpress.com/2008/09/24/crear-gif-animados-en-ubuntu-linux/
Mi liga de git: https://github.com/eddypre/VisionTriana
Cualquier duda o aclaración pueden ponerla en comentarios.
Para realizar las pruebas tuve que poner imágenes en las que su contorno estuviera bien definido, ya que con algunas pruebas simplemente no era posible detectar las figuras que componian la imagen.
1) Prueba 1
(Hacer click sobre la imagen para ampliar)
Procesos de conversión en GIF:
2) Prueba 2
(Hacer click sobre la imagen para ampliar)
Procesos de conversión en GIF:
3) Prueba 3
(Hacer click sobre la imagen para ampliar)
Procesos de conversión en GIF:
Para obtener GIF's, por si les interesa: http://andalinux.wordpress.com/2008/09/24/crear-gif-animados-en-ubuntu-linux/
Mi liga de git: https://github.com/eddypre/VisionTriana
Cualquier duda o aclaración pueden ponerla en comentarios.
Saludos a todos!
No hay comentarios:
Publicar un comentario