El procedimiento que realicé:
- Cambiamos a grises
- Agregamos el filtro de la mediana varias veces
- Sacamos la diferencia
- Ponemos un umbral
- Obtenemos esquinas
- Obtenemos los bordes con Laplaciana
- Agregamos BFS
- Hacemos un corte en cada primera esquina detectada
- Agregamos otra vez BFS en la imagen cortada
- Unimos esquinas
Capturas de pantalla:
Este es el código importante:
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
def boton_esq(): | |
#Cambiamos a grises | |
imagen = cambiar_agrises(path_imagen_original) | |
imagen.save("paso_1.jpg") | |
#Agregamos filtro de la mediana | |
imagen_median = cambiar_promedio(imagen) | |
for i in range(8): | |
imagen_median = cambiar_promedio(imagen_median) | |
imagen_median.save("paso_2.jpg") | |
#Sacamos la diferencia | |
imagen_dif = diferencia(imagen_median, imagen) | |
imagen_dif.save("paso_3.jpg") | |
#Ponemos un umbral y tenemos bordes | |
imagen_um = cambiar_umbral(imagen_dif, 0.3) #ESTE UMBRAL CAMBIA | |
imagen_um.save("paso_4.jpg") | |
#Agrego Laplaciana para bordes | |
umbral_valor = 0.5 | |
h_lap = numpy.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]]) | |
imagen_lap, puntos = convolucion(imagen, numpy.multiply(1.0/1.0,h_lap)) | |
imagen_lap = cambiar_umbral(imagen_lap, 0.1) | |
imagen_BFS = cambiar_umbral(imagen_lap, umbral_valor) | |
imagen_BFS.save("paso_5.jpg") | |
#Agregamos BFS | |
imagen_BFS, colores, poligonos = aplicar_BFS(imagen_BFS) | |
imagen_BFS.save("paso_6.jpg") | |
esq_pix = imagen_um.load() | |
dibuja = ImageDraw.Draw(imagen_lap) | |
corte = [] | |
for poli in poligonos: | |
for i in range(len(poli)): | |
esq = esq_pix[poli[i][0], poli[i][1]] | |
if esq[0] == 255: | |
dibuja.ellipse((poli[i][0]-6,poli[i][1]-6,poli[i][0]+6,poli[i][1]+6), fill="black") | |
cor = (poli[i][0], poli[i][1]) | |
corte.append((poli[i][0], poli[i][1])) | |
break | |
#Agregamos BFS | |
imagen_BFS, colores, poligonos = aplicar_BFS(imagen_lap) | |
imagen_BFS.save("paso_ALGO.jpg") | |
x, y = imagen.size | |
imagen_nueva = Image.new("RGB", (x, y)) | |
dibuja = ImageDraw.Draw(imagen_nueva) | |
cont = 0 | |
for poli in poligonos: | |
cor = (corte[cont][0], corte[cont][1]) | |
dibuja.ellipse((cor[0]-6,cor[1]-6,cor[0]+6,cor[1]+6), fill="red") | |
for i in range(len(poli)): | |
cor_ant = cor | |
esq = esq_pix[poli[i][0], poli[i][1]] | |
if esq[0] == 255: | |
dibuja.ellipse((poli[i][0]-6,poli[i][1]-6,poli[i][0]+6,poli[i][1]+6), fill="red") | |
cor = (poli[i][0], poli[i][1]) | |
if cor != "NULL" and cor_ant != cor and cor_ant != "NULL": | |
dibuja.line((cor_ant[0], cor_ant[1], cor[0], cor[1]), fill="red") | |
dibuja.line((corte[cont][0], corte[cont][1], cor[0], cor[1]), fill="red") | |
cont = cont + 1 | |
imagen_nueva.save("paso_7.jpg") |
La explicación no es exactamente la mejor posible, pero el código hace todo lo necesario. 9 pts.
ResponderEliminar