jueves, 28 de febrero de 2013

Laboratorio 4. Detección de diagonales

Para esta tarea de laboratorio se nos pidió ahora detectar diagonales en una imagen, utilizando la tarea de clase que fue detección de lineas horizontales y verticales.

Ahora a diferencia de en la tarea que solo detectaba ángulos de 0 y 90 grados, utilizo la función arctan para calcular los ángulos de los pixeles, también cambie las máscaras de convolución de Sobel por las de Prewitt.

Al final del programa como en el anterior, se definen colores para los pixeles dependiendo de los ángulos y se ponen diferentes si la línea es horizontal, vertical o diagonal.

No se cambiaron muchas cosas de la tarea de clase, sólo que ahora es capaz de detectar otros angulos diferentes de 0 y 90.

Código
def lines(img_gx, img_gy, imagen, umbral): #Mascara vertical
w,h = img_gx.size
comb = {}
for i in range(w):
datos = []
for j in range(h):
#se saca el promedio de los pixeles
pix_x = float(sum(img_gx.getpixel((i,j)))/3.0)
pix_y = float(sum(img_gy.getpixel((i,j)))/3.0)
#Si este promedio es mayor a 0 usamos la funcion arc para definir el angulo
if abs(pix_x) > 0:
angulo = math.atan(pix_y/pix_x)
#m_gx = img_gx.getpixel((i,j))[0]
#m_gy = img_gy.getpixel((i,j))[0]
else:
angulo = None
if angulo is not None:
angulo = int(math.degrees(angulo))
#damos valor a rho con funciones de seno y coseno
rho = int((j - h/2) * math.sin(angulo) + (w/2 - i) * math.cos(angulo))
angulos.append(angulo)
if i > 0 and i < w-1 and j > 0 and j < h - 1:
if (rho, angulo) in comb:
comb[(rho, angulo)] += 1
else:
comb[(rho, angulo)] = 1
datos.append((rho, angulo))
else:
datos.append((None, None))
matrix.append(datos)
comb = sorted(comb.items(), key=lambda k: k[1], reverse = True)
freq = {}
n = int(math.ceil(len(comb) * umbral))
for i in range(n):
(rho, angulo) = comb[i][0]
freq[(rho, angulo)] = comb[1]
pixeles = imagen.load()
for i in range(w):
for j in range(h):
if i > 0 and j > 0 and i < w and j < h:
rho, angulo = matrix[i][j]
print rho, angulo
if (rho, angulo) in freq:
#dependiendo del angulo ponemos un color diferente, si es vertical, horizontar o diagonal
print angulo
if angulo == 0:
imagen.putpixel((i,j),(255,0,0))
elif angulo == 90:
imagen.putpixel((i,j),(0,255,0))
else:
imagen.putpixel((i,j),(0,0,255))
return imagen

Resultados.

Imagen Original



Resultado




Imagen Original


Resultado




1 comentario: