Exercicio 9 - Filtragem no domínio da frequência

Funcao de teste global

1 def TestarFiltro(Imagem, FuncaoFiltro, ParametrosFiltro):
2 
3     IF = FuncaoFiltro(Imagem, ParametrosFiltro)
4 
5     iashow(Imagem, title='Imagem Original')
6     iashow(IF[1], title='Filtro Usado')
7     iashow(IF[2], title='Filtro + Espectro')
8     iashow(IF[0], title='Imagem Filtrada - Ganho do Filtro = %f' %IF[3])

Funcao Calculo Potencia

 1 def CalculoPotencia(F):
 2     F = asarray(F).astype(complex64)
 3     (m, n) = F.shape
 4 
 5     p = 0
 6     for iM in range(0, m):
 7         for iN in range(0, n):
 8             p = p + (F[iM, iN].real**2) + (F[iM, iN].imag**2)
 9 
10     return p

Funcao Calculo de Ganho

1 def CalculoDoGanho(F, FH):
2 
3     pt = CalculoPotencia(F)
4     p = CalculoPotencia(FH)
5 
6     return (p/pt)

Funcao Filtro Circular

 1 def FiltroCircular(Imagem, ParametrosFiltro):
 2     (m, n) = Imagem.shape
 3     t = ParametrosFiltro[0]
 4     f = ParametrosFiltro[1]
 5 
 6     if (t == 'LOW-PASS'):
 7         H = iacircle([m,n], f, [m/2, n/2])
 8     else:
 9         H = -iacircle([m,n], f, [m/2, n/2])
10 
11     F = iadft(Imagem)
12     FH = F * iaifftshift(H)
13 
14     return  [abs(iaidft(FH)), ianormalize(H,[0,255]), iadftview(FH), CalculoDoGanho(F, FH)]

Funcao Filtro Butterworth

 1 def FiltroButterworth(Imagem1,  ParametrosFiltro):
 2     t  = ParametrosFiltro[0]
 3     d0 = ParametrosFiltro[1]
 4     nf = ParametrosFiltro[2]
 5 
 6     Imagem = Imagem1[:,:-1]
 7     (n, m) = Imagem.shape
 8     (u, v) = iameshgrid(range(m), range(n))
 9 
10     d = sqrt((u-m/2)**2 + (v-n/2)**2)
11 
12     if( t == 'LOW-PASS' ):
13         H = 1 / (1 + (d/d0)**(2*nf))
14     else:
15         H = 1 / (1 + (d0/d)**(2*nf))
16 
17     F = iadft(Imagem)
18     Hc = iaifftshift(H)
19     print 'imagem (%d,%d) sim=%d' % (F.shape[0] , F.shape[1] , iaisdftsym(Hc))
20     FH = F * Hc
21 
22     return [abs(iaidft(FH)), ianormalize(H,[0,255]), iadftview(FH), CalculoDoGanho(F, FH)]

Funcao Filtro Gabor

 1 def FiltroGabor(Imagem,  ParametrosFiltro):
 2 
 3     (Y, X) = Imagem.shape
 4     Lambda = ParametrosFiltro[0]
 5     Theta  = ParametrosFiltro[1]
 6     Psi    = ParametrosFiltro[2]
 7     Sigma  = ParametrosFiltro[3]
 8     Gamma  = ParametrosFiltro[4]
 9 
10     (x,y) = iameshgrid(arange(-X/2, X/2), arange(-Y/2,Y/2))
11 
12     # Rotation
13     xl=  x*cos(Theta) +y*sin(Theta)
14     yl= -x*sin(Theta) +y*cos(Theta)
15 
16     H = exp(-((xl**2 + yl**2 * Gamma**2)/(2*Sigma**2)))* cos(2*pi*(xl/Lambda)+Psi)
17 
18     F = iadft(Imagem)
19     Hc = iaifftshift(H)
20     FH = F * Hc
21 
22     return [abs(iaidft(FH)), ianormalize(H,[0,255]), iadftview(FH), CalculoDoGanho(F, FH)]

Funcao Ler Parametros

1 def LerParametrosEntrada():
2     parser = OptionParser()
3     parser.add_option("--arquivo", type='string', default='Attachments/ia636-2009/exercicio9/barcode.tif', help='nome do arquivo de imagem')
4     parser.add_option("--tipo_filtro", type='string', default='LOW-PASS', help='tipo do filtro LOW-PASS / HIGH-PASS')
5     parser.add_option("--freq_corte", type='int', default=10, help='Valor da Frequencia de Corte / D0')
6     parser.add_option("--n_value", type='int', default=2, help='Valor de n para Filtro Butterworth')
7 
8     opt, arg = parser.parse_args()
9     return [opt.arquivo, opt.tipo_filtro, opt.freq_corte, opt.n_value]

Teste das Funcoes

1 (arquivo, tipo_filtro, freq_corte, n_value) = LerParametrosEntrada()
2 
3 Imagem = adreadgray(arquivo)
4 TestarFiltro(Imagem, FiltroCircular, [tipo_filtro, freq_corte])
5 TestarFiltro(Imagem, FiltroButterworth, [tipo_filtro, freq_corte, n_value])
6 TestarFiltro(Imagem, FiltroGabor, [15,0,0,10,0.5])
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)
imagem (256,255) sim=0
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

Filtro Usado

Filtro + Espectro

Imagem Filtrada - Ganho do Filtro = 0.937760

Imagem Original

Filtro Usado

Filtro + Espectro

Imagem Filtrada - Ganho do Filtro = 0.933293

Imagem Original

Filtro Usado

Filtro + Espectro

Imagem Filtrada - Ganho do Filtro = 0.924367