Filtragem no domínio da frequência

Autor:cronuxs
Data:22/05/2009

Exercicio

  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.

  2. Melhorar (e completar) a lição iadftdecompose da toolbox ia636

  3. 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.

Resolução

item 1

No caso do código de barras:

 1 imgbarra = mmreadgray('Attachments/ia636-2009/exercicio9/barcode.tif')
 2 
 3 tamanhoDoFiltro = 130
 4 n,m = imgbarra.shape
 5 x,y = iameshgrid(arange(m),arange(n))
 6 matrizInversao = (x + y)%2 - 1 + (x + y)%2
 7 
 8 filtro = iacircle(
 9     [n,m],
10     ((m/2)**2+(n/2)**2)**0.5 - tamanhoDoFiltro,
11     [n/2,m/2]).astype(complex) + complex(0,1)
12 
13 imgfiltrada = iaidft(iadft(imgbarra * matrizInversao) * filtro ).real * matrizInversao
14 
15 print "Tamanho Maximo do circulo: ",((m/2)**2+(n/2)**2)**0.5
16 mmshow(imgbarra,title='Imagem Original')
17 mmshow(iadftview(iadft(imgbarra)),title='Espectro')
18 mmshow(ianormalize(imgfiltrada,[0,256]),title='Imagem Filtrada')
19 mmshow(iadftview(iadft(imgfiltrada)),title='Espectro')
20 mmshow(filtro.real,title='Filtro')
Tamanho Maximo do circulo:  181.019335984
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Imagem Original

Espectro

Imagem Filtrada

Espectro

Filtro

No caso da impressão digital:

 1 imgdigit = mmreadgray('db1_a/1_1.tif')
 2 
 3 tamanhoDoFiltro = 200
 4 n,m = imgdigit.shape
 5 x,y = iameshgrid(arange(m),arange(n))
 6 matrizInversao = (x + y)%2 - 1 + (x + y)%2
 7 
 8 filtro = iacircle(
 9     [n,m],
10     ((m/2)**2+(n/2)**2)**0.5 - tamanhoDoFiltro,
11     [n/2,m/2]).astype(complex) + complex(0,1)
12 
13 imgfiltrada = iaidft(iadft(imgdigit * matrizInversao) * filtro ).real * matrizInversao
14 
15 print "Tamanho Maximo do circulo: ",((m/2)**2+(n/2)**2)**0.5
16 mmshow(imgdigit,title='Imagem Original')
17 mmshow(iadftview(iadft(imgdigit)),title='Espectro')
18 mmshow(ianormalize(imgfiltrada,[0,256]),title='Imagem Filtrada')
19 mmshow(iadftview(iadft(imgfiltrada)),title='Espectro')
20 mmshow(filtro.real,title='Filtro')
Tamanho Maximo do circulo:  269.453149917
Warning: downcasting image from double to uint16 (may lose precision)
Warning: downcasting image from double to uint16 (may lose precision)

Imagem Original

Espectro

Imagem Filtrada

Espectro

Filtro

Item 2

Criando uma rampa e seu espectro

 1 f = ones((128, 128)) * 50
 2 x, y = [], map(lambda k:k%128, range(-32,32))
 3 for i in range(128): x = x + (len(y) * [i])
 4 
 5 y = 128 * y
 6 put(f, iasub2ind([128,128], x, y), 200)
 7 img = f
 8 
 9 mmshow(iapad(img),title='Imagem Original')
10 mmshow(iapad(iadftview(iadft(img))),title='Espectro')
Warning: downcasting image from double to uint16 (may lose precision)

Imagem Original

Espectro

Ela pode ser construida passo a passo adicionando frequencias no espectro, observe:

 1 n,m = img.shape
 2 x,y = iameshgrid(arange(m),arange(n))
 3 matrizInversao = (x + y)%2 - 1 + (x + y)%2
 4 
 5 filtro = []
 6 for i in range(1,max(n,m)/2,4):
 7     filtro.append(iacircle([n,m], i, [n/2,m/2]).astype(complex) + complex(0,1))
 8 
 9 for i in filtro:
10     imgfiltrada = iaidft(iadft(img * matrizInversao) * i).real * matrizInversao
11     mmshow(iapad(ianormalize(imgfiltrada,[0,256])),title='Imagem Original')
12     mmshow(iapad(iadftview(iadft(imgfiltrada))),title='Espectro')
13 
14 pass
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)
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)
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)
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

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Imagem Original

Espectro

Item 3

Não desenvolvido