giovani_ex9 - Filtragem no domínio da frequência

  1. Usar a imagem do código de barras do curso do Khoros para demonstrar o uso de filtro no domínio da frequência. (http://www.dca.fee.unicamp.br/DIPcourse/html-dip/c5/s8/front-page.html). Usar também a imagem de impressão digital. (Imagem de impressão digital: 'db1_a/1_1.tif')

    Para projetar os filtros no domínio da frequência, utilize imagens sintéticas, como círculo ou quadrado ou retângulo (filtros ideais), tomando-se o cuidado para verificar se estes filtros são complexos-conjugados. Tomar cuidado que o projeto do filtro é normalmente feito no espectro ótico de Fourier, mas sua aplicação é feita com coordenadas 0 a N-1.

Filtros sintéticos Ideais

 1 #-----------------------------------------------------------------------------
 2 def gifiltroideal(s,d0,tipo,option):
 3 
 4     lin,col = s[0],s[1]
 5 
 6     if(tipo=='QUADRADO'):
 7         lar = minimum(d0*2,col)
 8         alt = minimum(d0*2,lin)
 9         H = iarectangle(s, [alt,lar], [lin/2.,col/2.])
10         if(option=='p_alta'):
11             H = 1*-H
12     else:
13         raio = minimum(minimum(d0,col),lin)
14         H = iacircle( s, raio , [lin/2.,col/2.] )
15         if(option=='p_alta'):
16             H = -H
17 
18     return H
19 #-----------------------------------------------------------------------------
20 def gifiltrobanda(s,banda,tipo):
21 
22     menor = gifiltroideal(s,banda[0],tipo,'p_baixa')
23     maior = gifiltroideal(s,banda[1],tipo,'p_baixa')
24     H = maior * -menor
25 
26     return H
27 #-----------------------------------------------------------------------------
28 def gifiltrobutterworth(s,d0,n,tipo):
29 
30     lin,col = s[0],s[1]
31     u,v = meshgrid(range(col),range(lin))
32     D_uv = sqrt((u-col/2)**2 + (v-lin/2)**2)
33 
34     if( tipo == 'p_baixa' ):
35          aux = D_uv/d0
36     else:
37          aux = d0/D_uv
38 
39     H = 1 / ( 1 + (aux)**(2*n) )
40     return H
41 #-----------------------------------------------------------------------------
42 def gifiltrofft(f,H):
43     F = iadft(f)
44     H = iaifftshift(H)
45     FH = F*H
46     fh = abs(iaidft(FH))
47 
48     return fh
49 #----------------------------------------------------------------------

Filtro Ideal quadrado

1 s = shape(img_barra/2)
2 d0 = 43
3 tipo = 'QUADRADO'
4 
5 baixa = gifiltroideal(s,d0,tipo,'p_baixa')
6 alta = gifiltroideal(s,d0,tipo,'p_alta')
7 
8 mmshow(baixa,title='Filtro Ideal Quadrado passa baixa')
9 mmshow(alta,title='Filtro Ideal Quadrado passa alta')
Warning: downcasting image from int32 to uint16 (may lose precision)

Filtro Ideal Quadrado passa baixa

Filtro Ideal Quadrado passa alta

Filtro Ideal Circular

1 s = shape(img_barra/2)
2 d0 = 43
3 tipo = 'CIRCULO'
4 
5 baixa = gifiltroideal(s,d0,tipo,'p_baixa')
6 alta = gifiltroideal(s,d0,tipo,'p_alta')
7 
8 mmshow(baixa,title='Filtro Ideal Circular passa baixa')
9 mmshow(alta,title='Filtro Ideal Circular passa alta')

Filtro Ideal Circular passa baixa

Filtro Ideal Circular passa alta

Filtro Ideal Banda Circular

1 s = shape(img_barra/2)
2 d0 = 43
3 tipo = 'CIRCULO'
4 
5 banda = gifiltrobanda(s,[d0,d0+15],tipo)
6 not_banda = 1*-banda
7 
8 mmshow(banda,title='Filtro Ideal Banda Circular')
9 mmshow(not_banda,title='Filtro Ideal Banda Circular negada')
Warning: downcasting image from int32 to uint16 (may lose precision)

Filtro Ideal Banda Circular

Filtro Ideal Banda Circular negada

Filtro Ideal Banda Quadrada

1 s = shape(img_barra/2)
2 d0 = 43
3 tipo = 'QUADRADO'
4 
5 banda = gifiltrobanda(s,[d0,d0+15],tipo)
6 not_banda = 1*-banda
7 
8 mmshow(banda,title='Filtro Ideal Banda Quadrada')
9 mmshow(not_banda,title='Filtro Ideal Banda Quadrada negada')
Warning: downcasting image from int32 to uint16 (may lose precision)

Filtro Ideal Banda Quadrada

Filtro Ideal Banda Quadrada negada

Filtro Butterworth

1 s = shape(img_barra/2)
2 d0 = 43
3 n=2
4 
5 Hb = gifiltrobutterworth(s,d0,n,'p_baixa')
6 Ha = gifiltrobutterworth(s,d0,n,'p_alta')
7 
8 iashow(ianormalize(Hb,[0,255]),title='Filtro Butterworth - Passa Baixa')
9 iashow(ianormalize(Ha,[0,255]),title='Filtro Butterworth - Passa Alta')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Filtro Butterworth - Passa Baixa

Filtro Butterworth - Passa Alta

Alguns Exemplos de filtragem utilizando os filtros sintéticos feitos anteriormente:

Exemplo com Codigo de Barra - Circulo

 1 s = shape(img_barra)
 2 d0 = 53
 3 
 4 tipo = 'QUADRADO'
 5 option = 'p_baixa'
 6 filtro = gifiltroideal(s,d0,tipo,option)
 7 
 8 espectro = iadft(img_barra)
 9 pectro_filt = iadftview(espectro) * filtro
10 ex1 = gifiltrofft(img_barra,filtro)
11 
12 
13 
14 iashow(img_barra,title='Imagem Original')
15 iashow(iadftview(espectro),title='Imagem Espectro')
16 iashow(filtro,title='Imagem filtro')
17 iashow(pectro_filt,title='Filtro aplicado sobre o espectro')
18 iashow(ex1,title='Imagem Filtrada')
19 iashow(img_barra-ex1,title='Diferença entre Img Original e img Filtrada')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Imagem Original

Imagem Espectro

Imagem filtro

Filtro aplicado sobre o espectro

Imagem Filtrada

Diferença entre Img Original e img Filtrada

Exemplo com Impressão Digital - Butterworth

 1 s = shape(img_digit)
 2 d0 = 63
 3 n=2
 4 filtro = gifiltrobutterworth(s,d0,n,'p_baixa')
 5 
 6 espectro = iadft(img_digit)
 7 pectro_filt = iadftview(espectro) * filtro
 8 ex2 = gifiltrofft(img_digit,filtro)
 9 
10 iashow(img_digit,title='Imagem Original')
11 iashow(iadftview(espectro),title='Imagem Espectro')
12 iashow(ianormalize(filtro,[0,255]),title='Filtro Butterworth - Passa Baixa')
13 iashow(pectro_filt,title='Filtro aplicado sobre o espectro')
14 iashow(ex2,title='Imagem Filtrada')
15 iashow(img_digit-ex2,title='Diferença entre Img Original e img Filtrada')
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Imagem Original

Imagem Espectro

Filtro Butterworth - Passa Baixa

Filtro aplicado sobre o espectro

Imagem Filtrada

Diferença entre Img Original e img Filtrada


  1. Melhorar (e completar) a lição iadftdecompose da toolbox ia636
  2. Qualquer outra opcional. Sugestões:
    • melhoria do código de iacos, calculando seus parâmetros no domínio da frequência.
    • função que calcula o filtro frequência, passando-se frequencia ou período de corte e o tipo de filtro (ideal circular, ideal retangular, gaussiano, etc.) e a imagem a ser filtrada.

Função iacos pela Transformada de Fourier

 1 #-----------------------------------------------------------------------------
 2 def gicos(s,t,theta,phi):
 3 
 4     lin,col = s[0],s[1]
 5 
 6     F = zeros(col)
 7     F[t]=1 ; F[col-t]=1;
 8     f = (iaidft(F)).astype(float)
 9     ft = iaptrans(ravel(f),[0,phi])
10     fr = resize(ft,[lin,col])
11     g = iageorigid( fr, [1,1], theta, [0,0]  )
12 
13     return g
14 #----------------------------------------------------------------------

Exemplo 01:

gicos - t = 15 theta = 0 phi = 0

Exemplo 02:

gicos - t = 4 theta = pi/4 phi = 5