daniel_chiu_Ex8

Autor: daniel_chiu
Data: 12/05/2009

Item 1 - Estudo das funções iacos, iadft e iadftview

A função iacos gera uma imagem cosenoidal, segundo a equação abaixo:

Onde, é o ângulo de direção da onda, é o período e é a fase.

 1 # Entradas: s=[m,n](tamanho),t(período),theta(direção da onda),phi(fase)
 2 parser = OptionParser()
 3 parser.add_option("--m", type='int', default=128, help='número de linhas')
 4 parser.add_option("--n", type='int', default=256, help='número de colunas')
 5 parser.add_option("--t", type='int', default=100, help='período (em pixels)')
 6 parser.add_option("--theta", type='int', default=45, help='direção da onda (em graus)')
 7 parser.add_option("--phi", type='int', default=0, help='fase (em graus)')
 8 
 9 opt, arg = parser.parse_args()
10 
11 s=[opt.m,opt.n]
12 t,theta,phi=opt.t,opt.theta*(pi/180),opt.phi*(pi/180)
13 
14 f=iacos(s,t,theta,phi)
15 
16 # Segundo a equação do iacos, a saída varia de -1 a 1. Assim, deve-se normalizar a imagem para visualização.
17 f_normal=(f+1)*(255.0/2)
18 f_normal=f_normal.astype(int32)
19 
20 adshow(f_normal, title='Imagem cosenoidal')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 14, in <module>
NameError: name 'iacos' is not defined

------------------------------------------------------------

O iadft gera a transformada de Fourier da imagem fornecida. Como os valores da transformada são muito grandes e complexas, é necessário normalizar e é isso que a função iadftview faz, tirando o logaritmo do array de entrada.

1 F=iadft(f)
2 print 'F.max=',F.max(),'\nF.min=',F.min()
3 Fv=iadftview(F)
4 adshow(abs(Fv), title='Espectro de Fourier da imagem acima')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
NameError: name 'iadft' is not defined

------------------------------------------------------------

Item 2 - Demonstração inversa da iadftdecompose

Abaixo, a função iadftdecompose, alterada para retornar o espectro da imagem f construída na função.

 1 def iadftdecompose():
 2     # Criação da imagem
 3     from ia636 import iasub2ind
 4 
 5     f = ones((128, 128)) * 50
 6     x, y = [], map(lambda k:k%128, range(-32,32))
 7     for i in range(128): x = x + (len(y) * [i])
 8 
 9     y = 128 * y
10     put(f, iasub2ind([128,128], x, y), 200)
11 
12     iashow(iapad(f).astype(uint16),title='Imagem original')
13 
14     # Realizando a transformada de Fourier na imagem
15     from ia636 import iadft
16     from ia636 import iadftview
17     from ia636 import iafftshift
18 
19     F = iadft(f)
20     E = iadftview(F)
21     iashow(E.astype(uint16))
22     print E[E.shape[0]/2,:]
23     mmplot([[E[E.shape[0]/2,:]]])
24     return F

Abaixo, vamos fazer a demonstração e em seguida, a recomposição parcial da imagem. Como se percebe no gráfico acima, há apenas contribuições nas frequências pares da transformada.

1 F=iadftdecompose()
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
  File "<string>", line 12, in iadftdecompose
NameError: global name 'iapad' is not defined

------------------------------------------------------------

1 for i in range(1,11):
2     F_parcial=F.copy()
3     F_parcial[:,2*i:128-2*i]=0
4     adshow(iaidft(F_parcial),title='Acréscimo das frequências '+str(2*i)+' e '+str(128-2*i))
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 2, in <module>
NameError: name 'F' is not defined

------------------------------------------------------------

Item 3 - Repetição do exercício passado pelo Prof. Clésio

Função rampa

1 RAMPA=array([1,1,1,1,0,0,0,0])
2 print 'Função Rampa\n',RAMPA.round(decimals=5)
3 mmplot([[arange(8),RAMPA]],ptitle='Rampa')
4 TF_RAMPA=iadft(RAMPA)
5 VIEW_TF_RAMPA=iadftview(TF_RAMPA)
6 print '\nTransformada da função Rampa\n',TF_RAMPA.round(decimals=5)
7 mmplot([[arange(8),VIEW_TF_RAMPA]],ptitle='DFT Rampa')
ERROR execute
Função Rampa
[1 1 1 1 0 0 0 0]
------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 4, in <module>
NameError: name 'iadft' is not defined

------------------------------------------------------------

Função senóide (um período - 8 amostras)

1 SENOIDE8=sin(2*pi*arange(8)/8)
2 print 'Função senóide - 8 amostras\n',SENOIDE8.round(decimals=5)
3 mmplot([[arange(8),SENOIDE8]],ptitle='Senoide - 8 amostras')
4 TF_SENOIDE8=iadft(SENOIDE8)
5 VIEW_TF_SENOIDE8=iadftview(TF_SENOIDE8)
6 print '\nTransformada da função senóide\n',TF_SENOIDE8.round(decimals=5)
7 mmplot([[arange(8),VIEW_TF_SENOIDE8]],ptitle='DFT Senoide')
ERROR execute
Função senóide - 8 amostras
[ 0.       0.70711  1.       0.70711  0.      -0.70711 -1.      -0.70711]
------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 4, in <module>
NameError: name 'iadft' is not defined

------------------------------------------------------------

Restaurando as funções acima, temos:

1 TFI_RAMPA=iaidft(TF_RAMPA)
2 print 'Rampa restaurada\n',TFI_RAMPA.round(decimals=5)
3 mmplot([[arange(8),TFI_RAMPA]],ptitle='Rampa restaurada')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
NameError: name 'iaidft' is not defined

------------------------------------------------------------

1 TFI_SENOIDE8=iaidft(TF_SENOIDE8)
2 print 'Senóide restaurada - 8 amostras\n',TFI_SENOIDE8.round(decimals=5)
3 mmplot([[arange(8),TFI_SENOIDE8]],ptitle='Senoide restaurada')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
NameError: name 'iaidft' is not defined

------------------------------------------------------------

Vamos colocar um valor na componente 0 de cada função transformada e observar o que acontece.

1 TF_RAMPA_OFFSET=TF_RAMPA.copy()
2 TF_RAMPA_OFFSET[0]=80
3 RAMPA_OFFSET=iaidft(TF_RAMPA_OFFSET)
4 print 'Rampa com offset alterado\n',RAMPA_OFFSET.round(5)
5 mmplot([[arange(8),RAMPA_OFFSET]],ptitle='Rampa com offset alterado')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
NameError: name 'TF_RAMPA' is not defined

------------------------------------------------------------

1 TF_SENOIDE8_OFFSET=TF_SENOIDE8.copy()
2 TF_SENOIDE8_OFFSET[0]=80
3 SENOIDE8_OFFSET=iaidft(TF_SENOIDE8_OFFSET)
4 print 'Senóide com offset alterado\n',SENOIDE8_OFFSET.round(5)
5 mmplot([[arange(8),SENOIDE8_OFFSET]],ptitle='Senoide com offset alterado')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
NameError: name 'TF_SENOIDE8' is not defined

------------------------------------------------------------

Como pode-se perceber, a componente 0 é o offset da função no domínio do tempo. Alterando-a, altera-se o offset.

Abaixo, vamos reconstituir ambas funções passo a passo:

1 TF_RAMPA_PP=zeros_like(TF_RAMPA)
2 for i in range(8):
3     TF_RAMPA_PP[i,0]=TF_RAMPA[i,0]
4     mmplot([[arange(8),iaidft(TF_RAMPA_PP)]],ptitle='Rampa - Adicionando a componente '+str(i))
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 1, in <module>
NameError: name 'TF_RAMPA' is not defined

------------------------------------------------------------

1 TF_SENOIDE8_PP
2 =zeros_like(TF_SENOIDE8)
3 for i in range(8):
4     TF_SENOIDE8_PP[i,0]=TF_SENOIDE8[i,0]
5     mmplot([[arange(8),iaidft(TF_SENOIDE8_PP)]],ptitle='Senoide - Adicionando a componente '+str(i))
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 2
    =zeros_like(TF_SENOIDE8)
    ^
SyntaxError: invalid syntax

------------------------------------------------------------