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).
******
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 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 |
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.
******
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 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 | |
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í .
Pues, en realidad es código viejo tal cual. 3 pts.
ResponderEliminar