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
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 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
OK lo obligatorio; 7 pts.
ResponderEliminar