Etiquetas

jueves, 2 de mayo de 2013

Actividad # 8 - Detección de Polígonos

Para esta semana, lo que se nos pidió fue trabajar sobre el tema detección de polígonos. Lo que se busca principalmente es identificar cualquier polígono dentro de una imagen dada.

Primero, un polígono es una figura geométrica que esta compuesta por segmentos rectos consecutivos que cierran cierta región.
Ahora para detectar si existe un polígono o no dentro de la imagen, lo primero que tenemos que hacer es recorrer la imagen con un bfs, como se ha hecho anteriormente para detectar las formas dentro de la imagen. ( Detección de formas).

******
def bfs(img,ancho,alto,color,posa):
pixel= img.load()
cont=0
cen1=[]
cen2=[]
cola=[] #creamos la cola
puntos = []
cola.append(posa) #posicion actual se agrega a la cola
bla = posa
inicio = pixel[posa]
while len(cola)>0:
(i,j)=cola.pop(0)
posa = pixel[i,j]
if (posa == inicio or posa ==color):
try:
if(pixel[i-1,j]):
if(pixel[i-1,j]==inicio):
pixel[i-1,j] = color
cola.append((i-1,j))
cont+=1 # contador para encontrar los pixeles ke van en gris
cen1.append((i-1))
cen2.append((j))
puntos.append((i-1,j))
except:
pass
try:
if(pixel[i+1,j]):
if(pixel[i+1,j]==inicio):
pixel[i+1,j] = color
cola.append((i+1,j))
cont+=1
cen1.append((i+1))
cen2.append((j))
puntos.append((i+1,j))
except:
pass
try:
if(pixel[i,j-1]):
if(pixel[i,j-1]==inicio):
pixel[i,j-1] = color
cola.append((i,j-1))
cont+=1
cen1.append((i))
cen2.append((j-1))
puntos.append((i,j-1))
except:
pass
try:
if(pixel[i,j+1]):
if(pixel[i,j+1]==inicio):
pixel[i,j+1] = color
cola.append((i,j+1))
cont+=1
cen1.append((i))
cen2.append((j+1))
puntos.append((i,j+1))
except:
pass
img = img.save('forms.jpg')
return cont,color,cen1,cen2,puntos,bla
view raw bfs.py hosted with ❤ by GitHub
******
Después de eso ubicamos cada una de las lineas que conforman las figuras y almacenamos sus coordenadas dentro de un lista, después calculamos las pendientes de cada una de los pixeles para saber si están dentro de una misma linea.

******
def frecuentes(histo, cantidad):
frec = list()
for valor in histo:
if valor is None:
continue
frecuencia = histo[valor]
acepta = False
if len(frec) <= cantidad:
acepta = True
if not acepta:
for (v, f) in frec:
if frecuencia > f:
acepta = True
break
if acepta:
frec.append((valor, frecuencia))
frec = sorted(frec, key = lambda tupla: tupla[1])
if len(frec) > cantidad:
frec.pop(0)
incluidos = list()
for (valor, frecuencia) in frec:
incluidos.append(valor)
return incluidos
def lineas(img2,ancho,alto,gx,gy):
pixels=img2.load()
cero = 0.0001
angulos = []
rho = 0.0
rhos = []
print len(gx)
print alto
for x in range(alto):
rhos.append([])
angulos.append([])
for y in range(ancho):
hor = gx[x][y]
ver = gy[x][y]
if fabs(hor) > 0:
angulo = atan(ver/hor) #calculamos angulo
else:
if fabs(ver)+fabs(hor)< cero:
angulo = None
elif fabs(ver - hor) < cero:
angulo = 0.79
elif fabs(hor)*fabs(ver) > 0.0:
angulo = 3
else:
angulo = 0.0
if angulo is not None:
while angulo< cero:
angulo+=pi
while angulo >pi:
angulo -= pi
angulo= float('%0.2f'%angulo)
rho =( ( (y-ancho/2)*cos(angulo) )+((ancho/2 -x)*sin(angulo)) )
print "valor angulos= ",angulo
#rho
#rho = (y - ancho/2)*cos(angulo)+(x -alto/2)*sin(angulo)
angulos[x].append(angulo)
rhos[x].append(int(rho))
else:
angulos[x].append(None)
rhos[x].append(None)
hola=dict()
for i in range(alto):
for j in range(ancho):
try:
#print "si se puede o no se puede "
if rhos[i][j] != None:
if pixels[i,j][0]==255:
dato = ((rhos[x][y]),(angulos[x][y]))
if dato in hola:
hola[dato]+=1
else:
hola[dato] =1
except:
pass
#frecuencias :D
frec = frecuentes(hola, int(ceil(len(hola)*50)))
print 'pase aki'
for i in range(alto):
for j in range(ancho):
if i>0 and j>0 and i<alto-1 and j<ancho-1:
try:
#print "si paso aki la llama"
if pixels[j,i][1] ==255:
if rhos[i][j] != None:
rho,ang = rhos[i][j],angulos[i][j]
print "segunda llama: ",ang
#if (rho,ang) in frec:
print'aki paso'
if 1.91 <= ang <=3.14: #or ang == 0:
print 'rojo'
pixels[j,i] = (255,0,0)
if 1.50 <=ang <=1.90:
print 'verde'
pixels[j,i]=(0,255,0)
if ang == 0.79:
print'azul'
pixels[j,i]=(0,0,255)
else:
pixels[j,i]=(154,255,80)
except:
pass
img2.save('lineas.jpg')
def pend(img,ancho,alto):
pro = []
frec = [] # visitados
cont = 1
coor = []
tot = []
c =[]
for i in range(alto):
frec.append([])
for j in range(ancho):
total += 1
try:
bl = coor.index((j,i))
frec[i].append(0)
if c == 0 :
c = 1
pro.append((j,i))
except:
frec[i].append(1)
mm = []
while len (pro)>0:
x = pro[len(pro)-1][0]
y = pro[len(pro)-1][1]
pro.pop(len(pro)-1)
mm.append([])
if gx[y][x] !=0:
pnte=gy[y][x] / gx[y][x]
else:
pnte = gy[y][x]/1
view raw mm.py hosted with ❤ by GitHub
******

Y eso es todo lo que pude obtener ya que inicialmente quise reutilizar mi código para encontrar las lineas pero al querer hacer lo de las pendientes me revolví .

1 comentario: