lunes, 18 de febrero de 2013

TAREA 2 -VISION


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
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')
view raw gistfile1.py hosted with ❤ by GitHub




Imagen Original


Imagen Binarizada 

























Ahora se aplica BFS.

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')
view raw gistfile1.py hosted with ❤ by GitHub


Y esta es la imagen obtenida.


Después se agrega al código un método para sacar los porcentajes que ocupa cada figura en la imagen.


Y aquí esta la ejecución en la terminal identificando las 15 figura contando el fondo.




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')
view raw gistfile1.py hosted with ❤ by GitHub

1 comentario:

  1. Tu entrada no tiene etiqueta. Casi te puse NP.

    En la implementación faltó lo de centros de masa y etiquetas de objetos.

    4 pts.

    ResponderEliminar