Detección de Formas
En la tarea 2 de clase se encargo realizar un programa que detectara formas en la imagen, y deberían estar separadas por sus bordes.
Se debe pintar cada imagen de diferente color , y la figura de mayor tamaño debería ser de un solo color ya que es el fondo de la imagen.
Antes de detectar formas
Se utilizó el código programado en la tarea anterior, para la detección de los contornos.
Se convirtió la imagen a escala de grises y se aplico convolución y binarización.
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
from random import * | |
import random | |
import pygame | |
from pygame.locals import * | |
import Image | |
import math | |
#IMAGEN BORROSA | |
image = Image.open("casa.jpg") | |
pixeles = image.load() | |
ancho, altura =image.size | |
numero=raw_input("Teclea el numero de filtro que quieres ") | |
numerofiltro=int(numero) | |
for z in range(numerofiltro): | |
for x in range(ancho): | |
for y in range(altura): | |
contador = 1 | |
promedio = 0 | |
# Toma el RGB del pixel | |
(r,g,b) = pixeles[ x, y ] | |
promedio += ( r + g + b ) / 3 | |
# Vecino Norte | |
try : | |
if x - 1 < 0: | |
None | |
else: | |
r1, g1, b1 = pixeles[ ( x - 1 ), y ] | |
promedio += ( r1 + g1 + b1 ) / 3 | |
contador = contador + 1 | |
except: | |
pass | |
# Vecino Sur | |
try : | |
if x + 1 >= ancho: | |
None | |
else: | |
r2, g2, b2 = pixeles[ ( x + 1 ), y ] | |
promedio += ( r2 + g2 + b2 ) / 3 | |
contador = contador + 1 | |
except: | |
pass | |
# Vecino Oeste | |
try: | |
if y - 1 < 0: | |
None | |
else: | |
r3, g3, b3 = pixeles[ x, ( y - 1 ) ] | |
promedio += ( r3 + g3 + b3 ) / 3 | |
contador = contador + 1 | |
except: | |
pass | |
# Vecino Este | |
try: | |
if y + 1 >= altura: | |
None | |
else: | |
r4, g4, b4 = pixeles[ x, ( y + 1 ) ] | |
promedio += ( r4 + g4 + b4 ) / 3 | |
contador = contador + 1 | |
except: | |
pass | |
promedio /= contador | |
# Coloca el valor obtenido en el pixel actual | |
pixeles[ x, y ] = ( promedio, promedio, promedio ) | |
image.save('salidafiltrada2.png', 'png') | |
#image.show() | |
#FOTO ESCALA DE GRISES | |
image = Image.open("casa.jpg") | |
pixeles = image.load() | |
ancho, altura =image.size | |
for x in range(ancho): | |
for y in range(altura): | |
(r,g,b) = image.getpixel((x,y)) | |
promedio=((r+g+b)/3) | |
pixeles[x,y] = (promedio,promedio,promedio) | |
image.save('salidafiltrada3.png', 'png') | |
image.show() | |
#CONVOLUCION DE LA ESCALA DE GRISES Y FILTRADA | |
image = Image.open("salidafiltrada2.png") | |
pixeles = image.load() | |
ancho, altura =image.size | |
mascara4 = [[0,1,0],[1,-4,1],[0,1,0]] | |
msobelX = ([-1, 0, 1], [-2, 0, 2], [-1, 0, 1]) #Para gradiente de x. | |
msobelY = ([1, 2, 1], [0, 0, 0], [-1, -2, -1]) #Para gradiente de y. | |
tamanomatriz=3 | |
sumatoriaX = 0 | |
sumariaY = 0 | |
seleccion=raw_input("INGRESA 1 PARA SOBEL y DOS PARA PREWITT ") | |
matrizagarrada=int(seleccion) | |
if matrizagarrada==1: | |
for x in range(altura): | |
for y in range(ancho): | |
sumatoriaX = 0 | |
sumatoriaY = 0 | |
if x != 0 and y != 0 and y != ancho and x != altura: | |
for i in range(tamanomatriz): | |
for j in range(tamanomatriz): | |
try: | |
gx = msobelX[i][j]*pixeles[y+j, x+i][1] | |
gy = msobelY[i][j]*pixeles[y+j, x+i][1] | |
except: | |
productosGX = 0 | |
productosGY = 0 | |
sumatoriaX = gx+sumatoriaX | |
sumatoriaY = gy+sumatoriaY | |
gxalcuadrado = pow(sumatoriaX, 2) | |
gyalcuadrado = pow(sumatoriaY, 2) | |
gradienteResultante = int(math.sqrt(gxalcuadrado+gyalcuadrado)) | |
pixelNuevo=gradienteResultante | |
if pixelNuevo> 255: | |
pixelNuevo = 255 | |
if pixelNuevo < 0: | |
pixelNuevo = 0 | |
pixeles[y,x] = ( pixelNuevo, pixelNuevo, pixelNuevo) | |
image.save('salidatarea2.png', 'png') | |
#image.show() | |
#NORMALIZADAAAAAA | |
imagen_original = Image.open("salidatarea2.png") | |
x, y = imagen_original.size | |
imagen_normalizada = Image.new("RGB", (x, y)) | |
pixeles = [] | |
for a in range(y): | |
for b in range(x): | |
pix = imagen_original.getpixel((b, a))[0] | |
pixeles.append(pix) | |
maximo = max(pixeles) | |
minimo = min(pixeles) | |
print maximo | |
print minimo | |
l = 256.0/(maximo - minimo) | |
pixeles = [] | |
for a in range(y): | |
for b in range(x): | |
pix = imagen_original.getpixel((b, a))[0] | |
nuevo_pix = int(math.floor((pix-minimo)*l)) | |
pixeles.append((nuevo_pix, nuevo_pix, nuevo_pix)) | |
imagen_normalizada.putdata(pixeles) | |
imagen_normalizada.save("imagen_normalizada.png",'png') | |
#FOTO BINARISARLA | |
image = Image.open("imagen_normalizada.png") | |
pixeles = image.load() | |
ancho, altura =image.size | |
minimoo=7 | |
for x in range(ancho): | |
for y in range(altura): | |
if pixeles[x,y][1] < minimoo: | |
prom=0 | |
else: | |
prom= 255 | |
pixeles[x,y] = (prom,prom,prom) | |
#image.show() | |
image.save("imagenyafinal.png",'png') | |
Imagen Original
Imagen Binarizada
Ahora se aplica BFS.
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
from time import * | |
import sys | |
import Tkinter | |
from PIL import Image, ImageTk | |
import random | |
import math | |
from math import * | |
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]==(0,0,0):#Si es negro | |
r=random.randint(0,255)#Color random entre 0 y 255 | |
g=random.randint(0,255) | |
b=random.randint(0,255) | |
pixeles = image.load() | |
ancho, altura = image.size | |
cola = [] | |
ver = [] | |
hor= [] | |
cola.append((i,j)) | |
pixeldondeinicia = pixeles[i,j]#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 == (r,g,b):#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: | |
contenido = pixeles[i, j] | |
if contenido == pixeldondeinicia: | |
pixeles[i, j] = (r,g,b)#le da el color r,g,b que tenga | |
ver.append(i) | |
hor.append(j) | |
contador += 1 | |
cola.append((i, j)) | |
image.save("imagenfFINALLL.png",'png') | |
image.save("imagenfFINALLL.png",'png') | |
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
from time import * | |
import sys | |
import Tkinter | |
from PIL import Image, ImageTk | |
import random | |
import math | |
from math import * | |
image = Image.open("salidaconvolubinariza.png") | |
pixeles = image.load() | |
ancho, altura =image.size | |
contadordefiguras = 0 | |
for i in range(ancho): | |
for j in range (altura): | |
if pixeles[i,j]==(0,0,0):#Si es negro | |
r=random.randint(0,255)#Color random entre 0 y 255 | |
g=random.randint(0,255) | |
b=random.randint(0,255) | |
pixeles = image.load() | |
ancho, altura = image.size | |
cola = [] | |
ver = [] | |
hor= [] | |
cola.append((i,j)) | |
pixeldondeinicia = pixeles[i,j]#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 == (r,g,b):#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] = (r,g,b)#le da el color r,g,b que tenga | |
ver.append((i,j)) | |
#hor.append(j) | |
contador += 1 | |
cola.append((i, j)) | |
tamanodefigura = len(ver)#Se saca el tamano de cada forma | |
tamanodelaimagen = ancho * altura #se saca el tamano de la imagen (area) | |
porcent = tamanodefigura * 100 #Porcentaje | |
porcent = porcent/ float(tamanodelaimagen) | |
if porcent > .5: | |
contadordefiguras +=1 | |
print "Porcentaje de la figura numero " +str(contadordefiguras) + " es de " +str(porcent) | |
image.save("imagenfFINALLL.png",'png') | |
image.save("imagenfFINALLL.png",'png') |
Tu entrada no tiene etiqueta. Casi te puse NP.
ResponderEliminarEn la implementación faltó lo de centros de masa y etiquetas de objetos.
4 pts.