Lab09 - FFT
Objetivo: - Conhecer e praticar filtragem no domínio da frequência.
Filtros espectrais¶
Filtragem espectral é uma operação que tem a finalidade de reforçar ou atenuar certas frequências na imagem, mudando suas características de suavização ou reforço das bordas dos objetos.
Transformada de Fourier¶
Da mesma forma que existe audio com grave e agudo, existe imagens com frequencias baixa e alta. A Transformada de Fourier é usada para analisar as características de frequência de vários filtros. Para imagens, a Transformada Discreta de Fourier 2D (DFT) é usada para encontrar a imagem no domínio da frequência. Um algoritmo rápido chamado Fast Fourier Transform (FFT) é usado para o cálculo da DFT.
Exibindo uma imagem no dominio da frequência¶
Na OpenCV usamos a função cv2.dft()
import cv2
from matplotlib import pyplot as plt
import numpy as np
#carrega imagem
img = cv2.imread('face.png',0)
# Transformação discreta de Fourier
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft = np.fft.fftshift(dft)
# Aplicado uma função log para visualização da magnitude do espectro
magnitude_spectrum = np.log(cv2.magnitude(dft[:,:,0],dft[:,:,1]))
# Visualização das imagens
fig = plt.figure(figsize=(20,20))
plt.subplot(1, 2, 1),plt.title('Original')
plt.imshow(img, cmap="gray")
plt.subplot(1, 2, 2),plt.title('magnitude_spectrum')
plt.imshow(magnitude_spectrum, cmap="gray")
plt.show()
Filtro espectral¶
O filtro espectral (ou no domínio das frequências) usa o espectro da imagem para ressaltar ou atenuar determinadas carecterísticas de frequências da imagem. O mais comum é empregar filtros que manipulam diretamente a magnitude das frequências, que podem ser do tipo:
- Filtro passa-baixas (PB): realça baixas frequências e atenua as altas, multiplicando por valores baixos a magnitude das frequências maiores
- Filtro passa-altas (PA): realça altas frequências e atenua as baixas, multiplicando por valores baixos a magnitude das frequências menores
- Filtro passa-faixa (PF): realça uma região do espectro em torno de determinada frequência
Filtro passa-baixas¶
import cv2
from matplotlib import pyplot as plt
import numpy as np
#carrega imagem
img = cv2.imread('face.png',0)
# extraindo shape da imagem
rows, cols = img.shape
half_row, half_col = rows/2 , cols/2
limiar = 40
# Criando a máscara quadrada
mask = np.zeros((rows,cols,2),np.uint8)
mask[int(half_row-limiar):int(half_row+limiar), int(half_col-limiar):int(half_col+limiar)] = 1
# Transformada discreta de Fourier
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft = np.fft.fftshift(dft)
# Aplicar filtro na imagem
dft_mask = dft*mask
# Transformada inversa de Fourier
dft_mask = np.fft.ifftshift(dft_mask)
img_restored = cv2.idft(dft_mask)
img_restored = cv2.magnitude(img_restored[:,:,0],img_restored[:,:,1])
# Visualização das imagens
fig = plt.figure(figsize=(20,20))
plt.subplot(1, 2, 1),plt.title('Original')
plt.imshow(img, cmap="gray")
plt.subplot(1, 2, 2),plt.title('img_restored')
plt.imshow(img_restored, cmap="gray")
plt.show()
Filtro passa-altas¶
import cv2
from matplotlib import pyplot as plt
import numpy as np
#carrega imagem
img = cv2.imread('face.png',0)
# extraindo shape da imagem
rows, cols = img.shape
half_row, half_col = rows/2 , cols/2
limiar = 10
# Criando a máscara quadrada
mask = np.ones((rows,cols,2),np.uint8)
mask[int(half_row-limiar):int(half_row+limiar), int(half_col-limiar):int(half_col+limiar)] = 0
# Transformada discreta de Fourier
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft = np.fft.fftshift(dft)
# Aplicar filtro na imagem
dft_mask = dft*mask
# Transformada inversa de Fourier
dft_mask = np.fft.ifftshift(dft_mask)
img_restored = cv2.idft(dft_mask)
img_restored = cv2.magnitude(img_restored[:,:,0],img_restored[:,:,1])
# Visualização das imagens
fig = plt.figure(figsize=(20,20))
plt.subplot(1, 2, 1),plt.title('Original')
plt.imshow(img, cmap="gray")
plt.subplot(1, 2, 2),plt.title('img_restored')
plt.imshow(img_restored, cmap="gray")
plt.show()