miércoles, 20 de febrero de 2013

Laboratorio 3 Vision- Convex Hull

Para esta entrada de laboratorio se pidió obtener el Convex Hull de una imagen.

Esto es un polígono que recubre todo el contorno de la imagen.Se dijo que podíamos utilizar algún método para obtener los contornos de las imágenes , ya sea el de laboratorio o una imagen dibujada en alguna herramienta con fondo negro y los bordes blancos.  

Primeramente se aplica le echo en la tarea 2 pasada donde se programo un algoritmo BFS. Donde se buscaba el fondo negro y la figura, que en este caso es al reves busca el color blanco del contorno.

Aquí el código del BFS

from random import *
import random
import pygame
from pygame.locals import *
import Image
import math
def bfs(image, dondeinicia, color):
image = Image.open("salidaconvolubinariza.png")
pixeles = image.load()
ancho, altura =image.size
for i in range(ancho):
for j in range(altura):
if pixeles[i, j] == (255, 255, 255):
pixeles = image.load()
ancho, altura = image.size
cola = []
ver = []
hor= []
cola.append((dondeinicia))
pixeldondeinicia = pixeles[dondeinicia]#Donde empezara
contador= 0
while len(cola) > 0:#mientras la cola tenga valores
(x, y) = cola.pop(0)#se quita de la cola
puntoactual = pixeles[x, y]#punto actual toma el valor de la cola
if puntoactual == pixeldondeinicia or puntoactual == (color):#Si es igual al pixel donde inicia o a el color
for parax in [-1, 0, 1]:#Revisar los vecinos
for paray in [-1, 0, 1]:
i, j = (x + parax, y + paray)
if i >= 0 and i < ancho and j >= 0 and j < altura:#Si el pixel se encuentra dentro de los limites de la figura
contenido = pixeles[i, j]
if contenido == pixeldondeinicia:
pixeles[i, j] = (color)#le da el color r,g,b que tenga
ver.append((i,j))
#hor.append(j)
contador += 1
cola.append((i, j))
return contador,ver
view raw gistfile1.py hosted with ❤ by GitHub
X



Se crearon estas imagen para esta prueba. y este fue el resultado














Aquí esta el código
from random import *
import random
import pygame
from pygame.locals import *
import Image
import math
def bfs(image, dondeinicia, color):
image = Image.open("salidaconvolubinariza.png")
pixeles = image.load()
ancho, altura =image.size
for i in range(ancho):
for j in range(altura):
if pixeles[i, j] == (255, 255, 255):
pixeles = image.load()
ancho, altura = image.size
cola = []
ver = []
hor= []
cola.append((dondeinicia))
pixeldondeinicia = pixeles[dondeinicia]#Donde empezara
contador= 0
while len(cola) > 0:#mientras la cola tenga valores
(x, y) = cola.pop(0)#se quita de la cola
puntoactual = pixeles[x, y]#punto actual toma el valor de la cola
if puntoactual == pixeldondeinicia or puntoactual == (color):#Si es igual al pixel donde inicia o a el color
for parax in [-1, 0, 1]:#Revisar los vecinos
for paray in [-1, 0, 1]:
i, j = (x + parax, y + paray)
if i >= 0 and i < ancho and j >= 0 and j < altura:#Si el pixel se encuentra dentro de los limites de la figura
contenido = pixeles[i, j]
if contenido == pixeldondeinicia:
pixeles[i, j] = (color)#le da el color r,g,b que tenga
ver.append((i,j))
#hor.append(j)
contador += 1
cola.append((i, j))
return contador,ver
TURN_LEFT, TURN_RIGHT, TURN_NONE = (1, -1, 0)
def turn(punto1, punto2, punto3):
return cmp((punto2[0] - punto1[0])*(punto3[1] - punto1[1]) - (punto3[0] - punto1[0])*(punto2[1] - punto1[1]), 0)
def cv(puntos):
convex_hull = [min(puntos)]
for i in range(len(puntos)):
q = puntos[0]
for j in range(len(puntos)):
t = turn(puntos[j], cv[i], q)
if q == cv[i] or t == TURN_LEFT :
q = puntos[j]
cv.append(q)
if q == cvl[0]:
break
return cv
def cv_bn(im):
image = Image.open("salidaconvolubinariza.png")
pixeles = image.load()
ancho, altura =image.size
hulls = []
for i in range(ancho):
for j in range(altura):
if pixeles[i, j] == (255, 255, 255):#Se cambio para que encontrara blancos en vez de negros
contador, ver= bfs(image, (i, j), (255, 0, 0))#a mi Bfs que ya tenia
hulls.append(cv(ver))
for hull in hulls:
for puntos in hull:
pixeles[puntos] = (0, 255, 0)
image.save("imagenfXXFINALLL.png",'png')
return hulls
view raw gistfile1.py hosted with ❤ by GitHub
X



Debo de dar las gracias a Rafael Lopez que me ayudo y me paso este link de abajo que sirvió de muy buena referencia.


Referencias 

1 comentario: