lionisEX12

Autor: lionis
Data: 18/06/2009

1. Estudar a função iaresize da toolbox: ia636:iaresize:

1 f=[[0,1,2],[3,4,5],[6,7,8]]
2 print "Matriz f original"; print f
3 print "5x5"; print iaresize(f,[5,5])
4 print "10x10"; print iaresize(f,[10,10])
5 print "20x20"; print iaresize(f,[20,20])
Matriz f original
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
5x5
[[0 0 1 1 2]
 [0 0 1 1 2]
 [3 3 4 4 5]
 [3 3 4 4 5]
 [6 6 7 7 8]]
10x10
[[0 0 0 0 1 1 1 1 2 2]
 [0 0 0 0 1 1 1 1 2 2]
 [0 0 0 0 1 1 1 1 2 2]
 [0 0 0 0 1 1 1 1 2 2]
 [3 3 3 3 4 4 4 4 5 5]
 [3 3 3 3 4 4 4 4 5 5]
 [3 3 3 3 4 4 4 4 5 5]
 [3 3 3 3 4 4 4 4 5 5]
 [6 6 6 6 7 7 7 7 8 8]
 [6 6 6 6 7 7 7 7 8 8]]
20x20
[[0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5]
 [6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8]
 [6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8]
 [6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8]
 [6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8]]

2. Fazer a demonstração da redução no Adessowiki, inspirado na demonstração feita no Khoros acima.

Sem interpolação

 1 f = mmreadgray('Attachments/ia636-2009/lionisEX12/imagem1_EX12.png')
 2 
 3 h = uint16(zeros(f.shape))
 4 s = 4 #fator de redução
 5 h[::s,::s] = 1
 6 iashow(f, title='Imagem original')
 7 iashow(h, title='Filtro de impulsos a ser aplicado')
 8 
 9 F = iadft(f)
10 H = iadft(h)
11 iashow(iadftview(F), title='Transformada da imagem original')
12 iashow(iadftview(H), title='Transformada dos impulsos')
13 
14 g = f * h
15 G = iadft(g)
16 iashow(g, title='Produto no domínio espacial, da imagem com os impulsos')
17 iashow(iadftview(G), title='Transformada do produto')
18 
19 sG = G[0:f.shape[0]/s,0:f.shape[1]/s]
20 sf = uint16(abs(iaidft(sG)))
21 iashow(sf, title='Imagem original reduzida sem interpolação')
22 iashow(iadftview(sG), title='Transformada da imagem reduzida sem interpolação')

Imagem original

Filtro de impulsos a ser aplicado

Transformada da imagem original

Transformada dos impulsos

Produto no domínio espacial, da imagem com os impulsos

Transformada do produto

Imagem original reduzida sem interpolação

Transformada da imagem reduzida sem interpolação

Com interpolação

 1 def circleIdealLowPass(filter_size, radius):
 2     h,w = filter_size[0],filter_size[1]
 3 
 4     hm = round(float(h)/2)
 5     wm = round(float(w)/2)
 6 
 7     return iacircle(filter_size, radius, [hm,wm])*1
 8 
 9 iashow(f, title='Imagem original')
10 iashow(h, title='Filtro de impulsos a ser aplicado')
11 
12 F2 = F*iafftshift(circleIdealLowPass(f.shape,75))
13 iashow(iadftview(F), title='Transformada da imagem original')
14 iashow(iadftview(F2), title='Transformada da imagem após filtro passa-baixa circular')
15 
16 f2 = uint16(abs(iaidft(F2)))
17 iashow(f, title='Imagem original')
18 iashow(f2, title='Imagem interpolada')
19 
20 iashow(h, title='Filtro de impulsos a ser aplicado')
21 iashow(iadftview(H), title='Transformada dos impulsos')
22 
23 g2 = uint16(f2 * h)
24 G2 = iadft(g2)
25 iashow(g2, title='Produto no domínio espacial, da imagem com os impulsos')
26 iashow(iadftview(G2), title='Transformada do produto')
27 
28 sG2 = G2[0:f2.shape[0]/s,0:f2.shape[1]/s]
29 sf2 = uint16(abs(iaidft(sG2)))
30 iashow(sf2, title='Imagem original reduzida com interpolação')
31 iashow(iadftview(sG2), title='Transformada da imagem reduzida com interpolação')

Imagem original

Filtro de impulsos a ser aplicado

Transformada da imagem original

Transformada da imagem após filtro passa-baixa circular

Imagem original

Imagem interpolada

Filtro de impulsos a ser aplicado

Transformada dos impulsos

Produto no domínio espacial, da imagem com os impulsos

Transformada do produto

Imagem original reduzida com interpolação

Transformada da imagem reduzida com interpolação

Comparação entre as imagens

1 iashow(sf, title='Imagem original reduzida sem interpolação')
2 iashow(sf2, title='Imagem original reduzida com interpolação')
3 iashow(iadftview(sG), title='Transformada da imagem reduzida sem interpolação')
4 iashow(iadftview(sG2), title='Transformada da imagem reduzida com interpolação')

Imagem original reduzida sem interpolação

Imagem original reduzida com interpolação

Transformada da imagem reduzida sem interpolação

Transformada da imagem reduzida com interpolação

3. Nova iaresize, com parâmetro de interpolação

Criar uma nova função iaresize que seja a função atual melhorada, com um parâmetro adicional do tipo de interpolação e incluir a interpolação Butterworth (domínio da frequência), que pode ser inspirada na solução de ano anterior: http://calhau.dca.fee.unicamp.br/wiki/index.php/Luiz.wetzel_-_exercicio_9

 1 def butterworthLowPass(filter_size,D0,n):
 2     w,h = filter_size[0], filter_size[1]
 3     (u, v) = meshgrid(range(h), range(w))
 4     D = sqrt((u-h/2)**2 + (v-w/2)**2)
 5 
 6     return (1 / ( 1 + (D/D0)**(2*n) ))
 7 
 8 def iaresize2(f, new_shape, method):
 9     sy,sx = float(new_shape[0])/f.shape[0], float(new_shape[1])/f.shape[1]
10 
11     I = zeros(new_shape)
12     for i in range (0,new_shape[0]):
13         for j in range (0,new_shape[1]):
14             I[i,j] = (f[round(i/sy),round(j/sx)])
15 
16     IF = iadft(I)
17     if method == 'butterworth': #se for o filtro de Butterworth
18         IF *= iaifftshift(butterworthLowPass(IF.shape,90,3))
19     else: #filtro ideal
20         IF *= iafftshift(circleIdealLowPass(IF.shape,90))
21 
22     g = uint16(abs(iaidft(IF)))
23 
24     return g
25 
26 iashow(iadftview(F), title='Transformada da imagem original')
27 iashow(f, title='Imagem original')
28 
29 iashow(iaresize2(f, [350,350], 'ideal'), title='Imagem ampliada com filtro ideal')
30 iashow(iaresize2(f, [350,350], 'butterworth'), title='Imagem ampliada com butterworth')
31 
32 iashow(iaresize2(f, [150,150], 'butterworth'), title='Imagem reduzida com butterworth')
33 iashow(iaresize2(f, [150,150], 'ideal'), title='Imagem reduzida com filtro ideal')

Transformada da imagem original

Imagem original

Imagem ampliada com filtro ideal

Imagem ampliada com butterworth

Imagem reduzida com butterworth

Imagem reduzida com filtro ideal

  1. Fazer uma página que seria igual a iaresize, para ser substituída, contendo todos os campos de uma função: descrição, exemplos numéricos e de imagens, equações, etc.

Página do iaresize2