Para esta semana realizariamos lo que es la detección de circulos, para esto se utilizarón circulos con el mismo radio y ya conociendo el radio será introducido mediante la terminal para uso posterior.
Primero para poder detectar los circulos necesitaba encontrar lo que son los posibles centros en cada uno de ellos esto se logro encontrar teniendo xc y yc como se muestra en el código.
Para llegar a esto tengo lo antes utilizado para detectar bordes como es convolución donde utilizabamos el gradiente gx y gy para poder obtener la magnitud
Después obtenemos lo siguiente
Para identificar el centro utilizamos dos ecuaciones:
xc= x-radioCosθ
yc=y-radioSinθ
Aquí podemos ver dos centros para cada pixel al tomar el radio ya introducido anteriormente aun no da buen resultado :(
Código
Esto aun no esta terminado por el momento, me falta aun que localizara los centros dentro de todos los circulos, marcar los contornos de diferentes colores y lo correspondiente a laboratorio.
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
import sys, pygame | |
import Image | |
from sys import argv | |
from math import sqrt, sin, cos, fabs | |
import numpy | |
from time import* | |
import math | |
def main(): | |
pygame.init() # Inicializa pygame | |
screen = pygame.display.set_mode((400, 400)) | |
pygame.display.set_caption('Imagenes') | |
#imagen1 = conv(imagen) | |
imagen = conv() | |
img = pygame.image.load(imagen) | |
screen = pygame.display.get_surface() | |
while True: # Ciclo para las acciones en la ventana | |
for event in pygame.event.get(): | |
if event.type == pygame.QUIT: | |
sys.exit() | |
screen.blit(img, (0,0)) | |
pygame.display.update() | |
def conv(): | |
ima1 = Image.open("vane2.png") | |
imagen = ima1.load() | |
radio = int(argv[1]) | |
ancho,alto = ima1.size | |
frec = numpy.empty((ancho, alto)) #frecuecia en centros | |
#angulo = 0.0 | |
mat_x = ([-1,0,1],[-2,0,2],[-1,0,1]) | |
mat_y = ([1,2,1],[0,0,0],[-1,-2,-1]) | |
#conv = numpy.empty((ancho, alto)) | |
for i in range(ancho): | |
#gx.append([]) | |
#gy.append([]) | |
for j in range(alto): | |
sumx=0.0 | |
sumy = 0.0 | |
for m in range(len(mat_x[0])): | |
for h in range(len(mat_y[0])): | |
try: | |
mul_x= mat_x[m][h] * imagen[i+m, j+h][0] | |
mul_y= mat_y[m][h] * imagen[i+m, j+h][0] | |
except: | |
mul_x=0 | |
mul_y=0 | |
sumx=mul_x+sumx | |
sumy=mul_y+sumy | |
gx = pow(sumx,2) | |
gy = pow(sumy,2) | |
grad = int(math.sqrt(gx + gy)) | |
#circulo | |
if fabs(grad) > 0: | |
costheta = (float(sumx / grad)) | |
sintheta = (float(sumy / grad)) | |
xc = int(round(i - radio * costheta)) | |
yc = int(round(j - radio * sintheta)) | |
if xc >= 0 and xc < ancho and yc >= 0 and yc < alto: | |
frec[xc][yc] += 1 | |
#imagen[xc,yc] = (0,255,0) | |
#centros de circulos codigo Dra | |
maximo = 0 | |
suma = 0.0 | |
print "sumando" | |
for i in range(alto): | |
for j in range(ancho): | |
v = frec[j][i] | |
suma += v | |
if v > maximo: | |
maximo = v | |
promedio = suma / (ancho * alto) | |
umbral = maximo-promedio | |
#agregalox = [] | |
#agregaloy = [] | |
for i in range(alto): | |
for j in range(ancho): | |
v = frec[j][i] | |
if v > umbral: | |
print 'Posible centro en (%d, %d). ' % (i, j) | |
#agregalox.append(y) | |
#agregaloy.append(x) | |
imagen[i,j] = (255,0,0) | |
print frec | |
nueva = 'circulo.png' | |
otra = ima1.save(nueva) | |
return gx, gy, nueva | |
#def circulos() | |
#ima3= | |
if __name__ == "__main__": | |
main() |
No deben votar los que no son borde. No incluyas la votación adentro de la convolución; cuida la modularidad. 2 pts por el avance.
ResponderEliminar