Melhore o notebook sobre ondas senoidais (link), gerando outras senoides 2D e tentando interpretar o significado dos períodos $T_r$, $T_c$ e $T$, bem como das ferquências normalizadas $u$ e $v$. Comece tentando gerar senoides 2D, onde $T_r$ ou $T_c$ é nulo.
In [16]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from numpy.fft import fft2
import sys,os
ia898path = os.path.abspath('../../')
if ia898path not in sys.path:
sys.path.append(ia898path)
import ia898.src as ia
In [61]:
H = 128
W = 256
s = (H,W)
T = 40
theta = 45 * np.pi/180
f = ia.cos(s, T, theta, 0)
ia.adshow(ia.normalize(f, [0,255]))
OBS: estou usando a função adshow no lugar da implot pois percebi um efeito quadriculado na visualização (vejam abaixo).
In [67]:
plt.imshow(f, cmap='gray')
Out[67]:
A próxima atividade consiste em entender as diferentes implementações da translação periódica. Procure comparar as 3 versões (translação periódica).
Um dos cuidados nas implementações é observar que os parâmetros da translação podem ser negativos ou ainda bem maiores que a largura ou altura da imagem.
Antes de continuar, leia sobre a Transformada Discreta de Fourier (DFT) e sobre a Transformada Rápida de Fourier (FFT). Além dos slides colocados no Google Calssroom, dê uma olhada em alguns links interessantes:
No exemplo abaixo, a partir da onda senoidal bidimensional gerada na parte 1, calculamos a Transformada de Fourier usando a função fft2 do numpy. Para a visualização, é necessário fazer a translação periódica, para colocar a origem do espectro (0,0) no centro da imagem. Também é preciso usar o valor da magnitude do espectro resultante, já que o resultado da transformação é uma matriz complexa. E por fim, costumamos visualizar o log do resultado.
In [65]:
faux = f
F = fft2(faux)
H,W = faux.shape
ia.adshow(ia.normalize(np.log(np.abs(ia.ptrans(F,(H//2,W//2))+1))), [0,255])