jueves, 7 de marzo de 2013

Lab #5. Detección de circulos(Radios diferentes)

En esta semana en laboratorio corresponde a la detección de circulos con diferentes radios.

Para este proceso se utilizo parte del código de Clase. Detección circulos, como yo aun no detectaba los circulos aquí incluyo esta parte ya terminada, así como los centros de los circulos detectados con una correspondiente etiqueta.

Las ecuaciones para identificar el centro que utilice son las mismas que se mostraron en la entrada anterior:

xc= x-radioCosθ
yc=y-radioSinθ

Probe con algunas imagenes, tuve muchos problemas para llegar a un buen resultado y si creo que aun no es el resultado esperado. 


Con un radio = 100 y otro de 25 primero solo me mostraba un solo centro.
 



Otra imagen con un radio = 35 



Y parte del código con los cambios hechos

def circulos():
ima1 = Image.open("vane2.jpg")
imagen = ima1.load()
radio = int(argv[1])
ancho,alto = ima1.size
#frec = list()
frec = numpy.empty((ancho, alto)) #frecuecia en centros
#frec = []
mat_x = ([-1,0,1],[-2,0,2],[-1,0,1])
mat_y = ([1,2,1],[0,0,0],[-1,-2,-1])
for i in range(ancho):
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))
#obtener votos y centros
if fabs(grad) > 0:
costheta = (float(sumx / grad))
sintheta = (float(sumy / grad))
xc = int(round(i - radio * costheta))
yc = int(round(j - radio * sintheta))
xcm = (xc + alto)/2
ycm = (ancho/2) - yc
#centro = (xc)
if ycm >= 0 and xcm < alto and xcm >= 0 and ycm < ancho:
frec[xcm][ycm] += 1
# agregar los votados
for rango in range(1, int(round(alto*0.1))):
agregado = True
while agregado:
agregado = False
for y in range(ancho):
for x in range(alto):
v = frec[y][x]
if v > 0:
for dx in range(-rango, rango):
for dy in range(-rango, rango):
if not (dx == 0 and dy == 0):
if y + dy < ancho and y + dy >= 0 and x + dx >=0 and x + dx < ancho:
w = frec[y+dy][x+dx]
if w >0:
if v -rango >=w:
frec[y][x] = v + w
frec[y+dy][x+dx] = 0
agregado = True
#return frec
#votos 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)/2.0
centro = []
for i in range(alto):
for j in range(ancho):
v = frec[j][i]
if v > umbral:
print 'Posible centro en (%d, %d). ' % (j, i)
centro.append((j,i))
#def dibujac(ima1, radio, centro)
#Dibuja circulo
draw = ImageDraw.Draw(ima1)
ancho,alto = ima1.size
for c in range(len(centro)):
a = centro[c][0]
b = centro[c][1]
color = (255,random.randint(200,255), random.randint(0,200))
#toma el valor de radio para dibujar los circulos
draw.ellipse((a-radio, b-radio,a+radio,b+radio), fill=None, outline=color)
radio+=1
draw.ellipse((a-radio, b-radio, a+radio,b+radio), fill=None, outline=color)
radio+=2
#draw.ellipse((a-radio))
#Etiquetas y Id
draw.ellipse((a-2,b-2,a+2,b+2),fill="green")
draw.text(((a+2,b+2)), str(c),fill="red")
print "ID %s"%c
print frec
nueva = 'circulo.png'
otra = ima1.save(nueva)
return nueva
if __name__ == "__main__":
main()
view raw circulo2.py hosted with ❤ by GitHub


martes, 5 de marzo de 2013

Lab #5. Proveedores de HW & SW

Esta entrada correspode a un listado de proveedores de HW y de SW para gente que quiera implementar sistemas inteligentes, en qué se especializan, cómo conseguir los productos y qué productos tiene.

5Hertz 


Esté sería un buen proveedor para adquirir algunos de los materiales que se necesitan para algunos de los proyectos que hemos definido. Se especializa en electronica pero esta cuenta con mas variedad de productos 

Como conseguirlo

Se puede conseguir mediante una orden en linea tendriamos que registrarnos para poder realizar esta orden y aunque muchas veces no estan en existencia, podríamos adquirir aqui diferentes productos: 

Productos
Sensores, arduinos, rfid, motores, etc, por ejemplo 

Etiqueta RFID botón de ropa $45, la etiqueta contiene un identificador único que se puede leer con cualquier lector que maneje el protocolo EM4102 a 135 kHz

Steren
Este tambien puede ser utilizado para diferentes componentes electronicos básicos o mas avanzados. Es una buan solución para electronica avanzada.
 

Productos

Microcontroladores
Leds
Cables 

Como conseguirlo

En este caso podemos encontrarlo en sus diferentes sucursales en la localidad 


RFID Grupo Devbus 
Esta puede ayudar en cuanto a las personas que utlizaran este tipo de tecnología aquí puede encontrar diferentes componentes

Productos
Desde readers, antenas y toda la variedad de etiquetas/tags disponibles para cualquier aplicacion requqerida.

Solo tiene oficinas en el Estado de México




Tarea #4. Detección de circulos

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
cosθ=gx/g sinθ=gy/g

 

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