Filtro de Gabor

Autor:cronuxs
Data:04/06/2009

Exercício

  1. Corrigir os erros do exercício entregue na semana passada, fazendo uma nova página com a nova solução corrigida. Fazer um pequeno relatório mostrando onde estavam os erros.
  2. Fazer o exercício de classificação da orientação na imagem da impressão digital. Fazer no domínio da freqüência, ajustando bem a sintonia da distância entre as papilas. Classificar a orientação pelo ângulo de dê a maior resposta entre os diversos filtros de Gabor.
  3. Repetir o exercício de realce, no domínio da frequência em duas opções:
    1. fazendo-se a soma de todas as orientações dos filtros de Gabor
    2. projetando-se um filtro "anelar" inspirado nas bordas do filtro de Butterworth.

Resolução

item 1

Erros do exercício anterior:

  • O filtro no domínio espacial estava com o sistema de referencia no centro da imagem, assim o resultado saia deslocado.
  • O filtro estava dessintonizado.

Exercício Corrigido:

1 def Sgabor(size,theta,f,sigma):
2     lin,col = size
3     x,y = iameshgrid(arange(-col/2, col/2), arange(-lin/2, lin/2))
4     xt,yt = x * cos(theta) + y * sin(theta), -x * sin(theta) + y * cos(theta)
5     f = exp(
6                 -1/2. *( (xt**2) / (sigma[0]**2) + (yt**2) / (sigma[1]**2) )
7               ) * cos(2*pi*f*xt)
8     return iaptrans(f, array(f.shape)/2)
1 img = Sgabor((100,200),pi/4,1./10,(10,10))
2 mmshow(ianormalize(img,[0,256]),title='Filtro de gabor no dominio espacial')
3 mmshow(iadftview(iadft(img)),title='Filtro de gabor no dominio da frequência')
Warning: downcasting image from double to uint16 (may lose precision)

Filtro de gabor no dominio espacial

Filtro de gabor no dominio da frequência

espectro do filtro de gabor

overlay para auxiliar a sintonização

resposta do filtro em diversas direções

fingerprint filtrado

item 2

Classificação da imagem:

 1 import colorsys
 2 
 3 f = adread('db1_a/1_1.tif')
 4 F = iadft(f)
 5 
 6 shape = [3,f.shape[0],f.shape[1]]
 7 out = zeros(shape)
 8 
 9 for i in range(0,180,15):
10     r = radians(i)
11     H = iadft(Sgabor(f.shape,r,1./Frequencia,(SigmaX,SigmaY)))
12     #print i,'Simétrico?',iaisdftsym(H)
13 
14     G = F * H
15     f = abs(iaidft(G))
16 
17     c = array(colorsys.hsv_to_rgb(float(i)/180,1,1))
18 
19     out[0,:,:] += f * c[0]
20     out[1,:,:] += f * c[1]
21     out[2,:,:] += f * c[2]
22 
23     #mmshow(ianormalize(f,[0,255]))
24 
25 out = ianormalize(out,[0,255])
26 
27 adshow(out,title='imagem classificada')
28 adshow(adread('db1_a/1_1.tif'),title='imagem original')

imagem classificada

imagem original

item 3

item 3.1

 1 f = adread('db1_a/1_1.tif')
 2 F = iadft(f)
 3 
 4 H = zeros(f.shape,complex)
 5 
 6 for i in range(0,180,15):
 7     r = radians(i)
 8     Ht = iadft(Sgabor(f.shape,r,1./Frequencia,(SigmaX,SigmaY)))
 9     #print i,'Simétrico?',iaisdftsym(Ht)
10     H += Ht
11 
12 G = F * H
13 g = abs(iaidft(G))
14 
15 mmshow(iadftview(F),iafftshift(H)>0.5,title='overlay para auxiliar a sintonização')
16 
17 adshow(iadftview(G),title='Filtro')
18 adshow(ianormalize(f,[0,255]),title='Imagem Original')
19 adshow(ianormalize(g,[0,255]),title='Imagem Filtrada')

overlay para auxiliar a sintonização

Filtro

Imagem Original

Imagem Filtrada

item 3.2

 1 def butterworth(s,d0,n):
 2     lin,col = s
 3     u,v = meshgrid(range(col),range(lin))
 4     D_uv = sqrt((u-col/2)**2 + (v-lin/2)**2)
 5     aux = D_uv/d0
 6     H = 1 / ( 1 + (aux)**(2*n) )
 7     return iaifftshift(H)
 8 
 9 def anel(s,d0,d1,n0,n1):
10     return butterworth(s,d0,n0) - butterworth(s,d1,n1)
11 
12 f = adread('db1_a/1_1.tif')
13 F = iadft(f)
14 H = anel(f.shape,50,20,10,10)
15 G = F * H
16 g = abs(iaidft(G))
17 
18 mmshow(iadftview(F),iafftshift(H)>0.5,title='overlay para auxiliar a sintonização')
19 
20 adshow(iadftview(G),title='Filtro')
21 adshow(ianormalize(f,[0,255]),title='Imagem Original')
22 adshow(ianormalize(g,[0,255]),title='Imagem Filtrada')

overlay para auxiliar a sintonização

Filtro

Imagem Original

Imagem Filtrada