Mi repositorio
Para esta semana se trabajo nuevamente con los bordes pero ahora, teníamos que ubicar los puntos de las orillas que al unirlos envuelve por completo una figura.
Para esta semana se trabajo nuevamente con los bordes pero ahora, teníamos que ubicar los puntos de las orillas que al unirlos envuelve por completo una figura.
El algoritmo usado para obtenerlo es convex
hull al igual que 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
Código
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Image | |
from sys import argv | |
import ImageDraw | |
TURN_LEFT, TURN_RIGHT, TURN_NONE = (1, -1, 0) | |
def turn(p, q, r): | |
return cmp((q[0] - p[0])*(r[1] - p[1]) - (r[0] - p[0])*(q[1] - p[1]), 0) | |
#distancias entre p y q | |
def dist(p, q): | |
dx, dy = q[0] - p[0], q[1] - p[1] | |
return dx * dx + dy * dy | |
def next_hull_pt(points, p): #Para devolver el siguiente punto convexo desde la primer distancia p | |
q = p | |
for r in points: | |
t = turn(p, q, r) | |
if t == TURN_RIGHT or t == TURN_NONE and dist(p, r) > dist(p, q): | |
q = r | |
return q | |
def convex_hull(points): # Aplicamos algoritmo Convex Hull que devuelve los puntos envolventes hacia la izquierda | |
hull = [min(points)] | |
for p in hull: | |
q = next_hull_pt(points, p) | |
if q != hull[0]: | |
hull.append(q) | |
return hull | |
def bfs(imagen, rcolor, px, altura, ancho): # alicamos bfs para darle color al contorno de la imagen tomando los pixeles vecinos | |
pixeles = imagen.load() | |
(fila, columna) = px | |
original = pixeles[fila, columna] | |
cola = [(fila, columna)] | |
cola2 = [] | |
while len(cola) > 0: | |
(fila, columna) = cola.pop(0) | |
actual = pixeles[fila, columna] | |
if actual == original or actual == rcolor: | |
for dx in [-1, 0, 1]: | |
for dy in [-1, 0, 1]: | |
candidato = (fila + dy, columna + dx) | |
if candidato[0] >= 0 and candidato[0] < altura and candidato[1] >= 0 and candidato[1] < ancho: | |
contenido = pixeles[candidato[0], candidato[1]] | |
if contenido == original: | |
pixeles[candidato[0], candidato[1]] = rcolor | |
cola.append(candidato) | |
cola2.append(candidato) | |
return cola2 | |
def main(image): | |
im = Image.open(image) | |
w, h = im.size | |
pix = im.load() | |
hulls = [] | |
#draw = ImageDraw.Draw(im) | |
for i in range(w): | |
for j in range(h): | |
if pix[i, j] == (255, 255, 255): | |
coords = bfs(im, (255, 0, 0), (i, j), w, h)#BFS anteri | |
#print coords | |
hulls.append(convex_hull(coords)) | |
for hull in hulls: | |
for points in hull: | |
pix[points] = (0, 0, 0) | |
#draw.line(((hulls[i][j], hulls[i][j+1])), fill=(0, 0, 255)) | |
im.save("fin.jpg") | |
return hulls | |
image = argv[1] | |
main(image) |
4 pts
ResponderEliminarNP tarea 3 de clase.
ResponderEliminarNP lab de visión de esta semana.
ResponderEliminar