Exercício 10 - Filtro de Gabor no domínio espacial e da frequência

Autor: Wagner Machado do Amaral
Data: 26/05/2009

Enunciado: ia636-2009:exercicio10

1. Implementar o filtro de Gabor, tanto no domínio da frequência como no domínio espacial.

O Filtro de Gabor é um filtro linear onde a resposta a um impulso é definida por uma função harmônica multiplicada por uma gaussiana.

Gaussiana

1 N=100.
2 mu = N/2.
3 sigma = 10.
4 x = arange(N)
5 f = 1./(sqrt(2*pi*sigma)) * exp(-1./2 *  ( (x-mu)/sigma )**2 )
6 mmplot([[ianormalize(f,[0,255])]],title='Gaussiana')
7 
8 gaussiana = f

Gaussiana

Onda Senoidal

 1 N=100.
 2 phi=0.
 3 T=25.
 4 A=100.
 5 D = 0
 6 w = arange(N)
 7 y = A*sin( (2*pi/T)*w + phi ) + D
 8 mmplot([[ianormalize(y,[0,255])]],title='Onda Senoidal')
 9 
10 senoide = y

Onda Senoidal

Filtro de Gabor

1 h = gaussiana * senoide
2 mmplot([[ianormalize(h,[0,255])]],title='Filtro de Gabor - domínio espacial')
3 
4 H = iadft(h)
5 mmplot([[iadftview(H)]],title='Filtro de Gabor - domínio da frequência')

Filtro de Gabor - domínio espacial

Filtro de Gabor - domínio da frequência


Gaussiana

 1 N = 200. # x N u colunas
 2 M = 100. # y M v linhas
 3 mux = N/2.
 4 muy = M/2.
 5 sigmax = 10.
 6 sigmay = sigmax
 7 A = 1
 8 
 9 (x, y) = iameshgrid(range(N), range(M))
10 
11 f = A * exp( -1/2 * ( ((x-mux)/sigmax)**2 + ((y-muy)/sigmay)**2 ) )
12 iashow(ianormalize(f, [0,255]),title='Gaussiana')
13 
14 gaussiana = f
Warning: downcasting image from double to uint16 (may lose precision)

Gaussiana

Onda Senoidal

 1 N=200.
 2 M=100.
 3 theta = pi/4
 4 phi=0
 5 T=10
 6 A=1
 7 D = 0
 8 
 9 (w, h) = iameshgrid(range(N), range(M))
10 
11 w_ = w*cos(theta) + h*-sin(theta)
12 h_ = w*sin(theta) + h*cos(theta)
13 y = A*sin( (2*pi/T)*(w*cos(theta) + h*sin(theta)) + phi ) + D
14 iashow(ianormalize(y, [0,255]),title='Onda Senoidal')
15 
16 senoide = y
Warning: downcasting image from double to uint16 (may lose precision)

Onda Senoidal

Filtro de Gabor

1 h = gaussiana * senoide
2 iashow(ianormalize(h, [0,255]),title='Filtro de Gabor - domínio espacial')
3 
4 H = iadft(h)
5 iashow(iadftview(H),title='Filtro de Gabor - domínio da frequência')
Warning: downcasting image from double to uint16 (may lose precision)

Filtro de Gabor - domínio espacial

Filtro de Gabor - domínio da frequência


Equação do Filtro de Gabor

1 def gabor(x,y,theta,f,sigma_x,sigma_y):
2   (x,y) = iameshgrid(arange(-x/2, x/2), arange(-y/2,y/2))
3   x_theta = x * cos(theta) + y * sin(theta)
4   y_theta =-x * sin(theta) + y * cos(theta)
5   h = exp( -1/2 * ( x_theta**2/sigma_x**2 + y_theta**2/sigma_y**2) ) * cos(2*pi*f*x_theta)
6   return h
 1 x = 200
 2 y = 100
 3 theta = pi/4
 4 T = 10
 5 f = 1./T
 6 sigma_x = 10
 7 sigma_y = 10
 8 
 9 h = gabor(x,y,theta,f,sigma_x,sigma_y)
10 iashow(ianormalize(h,[0,255]), title='Filtro de Gabor - domínio espacial, origem centro')
11 
12 H = iadft(h)
13 iashow(iadftview(H),title='Filtro de Gabor - domínio da frequência')
14 
15 h0 = iafftshift(h)
16 iashow(ianormalize(h0,[0,255]), title='Filtro de Gabor - domínio espacial, origem (0,0)')
17 H0 = iadft(h0)
18 iashow(iadftview(H0),title='Filtro de Gabor - domínio da frequência (não muda)')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Filtro de Gabor - domínio espacial, origem centro

Filtro de Gabor - domínio da frequência

Filtro de Gabor - domínio espacial, origem (0,0)

Filtro de Gabor - domínio da frequência (não muda)

2. Aplicar o filtro de Gabor em diversas direções e classificar a orientação das regiões do fingerprint.

 1 imgname = 'db1_a/1_1.tif'
 2 f = adread(imgname)
 3 F = iadft(f)
 4 
 5 ####################################
 6 ## COR
 7 r = numpy.resize(range(256), (256,1))
 8 g = numpy.resize(range(256), (256,1))
 9 b = numpy.resize(range(256), (256,1))
10 ct = numpy.concatenate((r, g,b), 1)
11 cor = [
12   numpy.concatenate(([1],[0],[0]), 1),
13   numpy.concatenate(([0],[1],[0]), 1),
14   numpy.concatenate(([0],[0],[1]), 1),
15   numpy.concatenate(([1],[1],[0]), 1),
16   numpy.concatenate(([1],[0],[1]), 1),
17   numpy.concatenate(([0],[1],[1]), 1),
18   numpy.concatenate(([0.5],[0.5],[1]), 1),
19   numpy.concatenate(([1],[0.5],[0.5]), 1),
20   numpy.concatenate(([0.5],[1],[0.5]), 1)
21 ]
22 ######################################
23 
24 y,x = f.shape
25 T = 10 ; freq = 1./T
26 sigma_x, sigma_y = 12,12
27 thresholding=100
28 
29 resultado = f * 0
30 
31 n=0
32 for i in range(0,180,30):
33   theta = pi * -i / 180
34   h = gabor(x,y,theta,freq,sigma_x,sigma_y)
35   H = iadft(h)
36   FH = F * H
37   h0 = iafftshift(h)
38   H0 = iadft(h0)
39   FH0 = F * H0
40   adshow( iadftview(FH0), title='Filtro: Simetrico='+str(iaisdftsym(FH0)) )
41   g=abs(iaidft(FH0))
42   #g=iaifftshift(g)
43   g = ianormalize(g,[0,255])
44   g = g > thresholding
45   g = ianormalize(g,[0,255])
46   g = iaapplylut(g, ct*cor[n])
47   adshow( g , title='Filtro aplicado, thresholding '+str(thresholding) )
48   resultado = resultado + g
49   n=n+1
50 
51 adshow(f,title='Imagem Original')
52 adshow( resultado , title='orientação das regiões classificadas por cor' )

Filtro: Simetrico=True

Filtro aplicado, thresholding 100

Filtro: Simetrico=False

Filtro aplicado, thresholding 100

Filtro: Simetrico=True

Filtro aplicado, thresholding 100

Filtro: Simetrico=True

Filtro aplicado, thresholding 100

Filtro: Simetrico=False

Filtro aplicado, thresholding 100

Filtro: Simetrico=True

Filtro aplicado, thresholding 100

Imagem Original

orientação das regiões classificadas por cor