En esta tarea consiste en la
detección de líneas en una imagen, el cual utilizamos la transformada de hough.
Para esto hay que sacar “rho”
en cada píxel, esto nos da la dirección que tiene.
Para los gradientes de x y y
se utiliza la siguiente ecuación:
Para sacar gradiente en X y
Y se utilizó la máscara de sobel, ya que esta ya la habíamos utilizado en una
Tarea anterior.
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
#Convolucion | |
im = Image.open("escala.jpg") | |
pix = im.load() | |
dirX = ([-1, 0, 1], [-2, 0, 2], [-1, 0, 1]) | |
dirY = ([1, 2, 1], [0, 0, 0], [-1, -2, -1]) | |
for x in range(0,ancho-3): #Ancho | |
for y in range(0,largo-3): #Largo | |
sumDirX=0 | |
sumDirY=0 | |
for i in range(0,3): | |
for j in range(0,3): | |
sumDirX +=(pix[x+i,y+j][0]*dirX[i][j]) | |
sumDirY +=(pix[x+i,y+j][0]*dirY[i][j]) | |
potX = pow(sumDirX, 2) | |
potY = pow(sumDirY, 2) | |
res = int(math.sqrt(potX+potY)) | |
if res > 255: | |
res = 255 | |
if res < 0: | |
res = 0 | |
pix[x,y] = (res, res, res) | |
im.save("convolucion.jpg") | |
imagen=pygame.image.load("convolucion.jpg") | |
ventana.blit(imagen,(0,0)) | |
pygame.display.update() | |
#Lineas | |
CERO = 0.00001 | |
gx = dirX | |
gy = dirY | |
for x in range(ancho): | |
rhos.append([]) | |
ang.append([]) | |
magn.append([]) | |
for y in range(largo): | |
hor = gx[y][x] | |
ver = gy[y][x] | |
magnitud = m[y][x] | |
if fabs(hor) > CERO: | |
angulo = atan(ver / hor) # RELEVANTE | |
else: | |
if fabs(hor) + fabs(ver) < CERO: | |
angulo = None # aqui no hay nada en ninguna direccion | |
elif fabs(ver - hor) < CERO: # casi iguales | |
angulo = atan(1.0) | |
elif hor * ver > 0.0: # mismo signo | |
angulo = pi | |
else: # negativo -> -pi | |
angulo = 0.0 | |
# eje vertical volteado y origen al centro | |
if angulo is not None: | |
# asegurar que este entre cero y pi (0 y 180) | |
while angulo < CERO: | |
angulo += pi | |
while angulo > pi: | |
angulo -= pi | |
rho = (x - ancho/2) * cos(angulo) + (largo/2 - y) * sin(angulo) # RELEVANTE | |
# hay que discretizar - RELEVANTE | |
magn[x].append(magnitud) | |
ang[x].append('%.0f' % (int(180 * (angulo / pi)) / 18)) | |
rhos[x].append('%.0f' % rho) | |
else: | |
magn[x].append(None) | |
ang[x].append(None) | |
rhos[x].append(None) | |
im.save("lineas.jpg") | |
imagen=pygame.image.load("lineas.jpg") | |
ventana.blit(imagen,(0,0)) | |
pygame.display.update() |
Resultado: No logre detectar las líneas.
1 comentario:
Pues, es algo. atan2 facilitaría la vida. 2 pts.
Publicar un comentario