# -*- coding: utf-8 -*- """ Created on Mon Mar 24 19:22:14 2025 @author: Vitor_PC """ import cv2 import matplotlib.pyplot as plt import numpy as np # Leitura da imagem em cores imagem_colorida = cv2.imread('saturno.jpg') if imagem_colorida is None: raise FileNotFoundError("A imagem 'saturno.jpg' não foi encontrada na pasta.") # Conversão para escala de cinza imagem_cinza = cv2.cvtColor(imagem_colorida, cv2.COLOR_BGR2GRAY) # Aplicação da Transformada de Fourier F = np.fft.fft2(imagem_cinza) F_shift = np.fft.fftshift(F) # Obtenção das dimensões e centro da imagem rows, cols = imagem_cinza.shape crow, ccol = rows // 2, cols // 2 # ============================================================================= # Filtro Passa Baixa (Low-Pass) # ============================================================================= # Cria máscara circular central para preservar frequências baixas radius_lp = 50 # ajuste conforme necessário mask_lp = np.zeros((rows, cols)) cv2.circle(mask_lp, (ccol, crow), radius_lp, 1, thickness=-1) # Aplicação do filtro no domínio de Fourier F_shift_lp = F_shift * mask_lp F_ishift_lp = np.fft.ifftshift(F_shift_lp) img_back_lp = np.fft.ifft2(F_ishift_lp) img_back_lp = np.abs(img_back_lp) plt.figure(figsize=(12, 6)) # Plot: Imagem Original plt.subplot(2, 2, 1) plt.imshow(imagem_cinza, cmap='gray') plt.title('Imagem Original') plt.axis('off') # Plot: Máscara de Fourier (Passa Baixa) plt.subplot(2, 2, 2) plt.imshow(mask_lp, cmap='gray') plt.title('Máscara Fourier - Passa Baixa') plt.axis('off') # Plot: Imagem Reconstruída - Passa Baixa plt.subplot(2, 2, 3) plt.imshow(img_back_lp, cmap='gray') plt.title('Imagem Reconstruída - Passa Baixa') plt.axis('off') plt.show() # ============================================================================= # Filtro Passa Baixa com suavização Gaussiana # ============================================================================= radius_lp = 50 # ajuste conforme necessário mask_lp = np.zeros((rows, cols)) cv2.circle(mask_lp, (ccol, crow), radius_lp, 1, thickness=-1) y, x = np.ogrid[:rows, :cols] distance = np.sqrt((x - ccol)**2 + (y - crow)**2) gaussian_smoothing = np.exp(-(distance**2) / (2 * (radius_lp / 2)**2)) mask_lp *= gaussian_smoothing F_shift_lp = F_shift * mask_lp F_ishift_lp = np.fft.ifftshift(F_shift_lp) img_back_lp = np.fft.ifft2(F_ishift_lp) img_back_lp = np.abs(img_back_lp) plt.figure(figsize=(12, 6)) # Plot: Imagem Original plt.subplot(2, 2, 1) plt.imshow(imagem_cinza, cmap='gray') plt.title('Imagem Original') plt.axis('off') # Plot: Máscara de Fourier (Passa Baixa) plt.subplot(2, 2, 2) plt.imshow(mask_lp, cmap='gray') plt.title('Máscara Fourier - Passa Baixa') plt.axis('off') # Plot: Imagem Reconstruída - Passa Baixa plt.subplot(2, 2, 3) plt.imshow(img_back_lp, cmap='gray') plt.title('Imagem Reconstruída - Passa Baixa') plt.axis('off') plt.show() # ============================================================================= # Filtro Passa Alta (High-Pass) # ============================================================================= # A máscara passa alta é o complemento da máscara passa baixa mask_hp = 1 - mask_lp F_shift_hp = F_shift * mask_hp F_ishift_hp = np.fft.ifftshift(F_shift_hp) img_back_hp = np.fft.ifft2(F_ishift_hp) img_back_hp = np.abs(img_back_hp) plt.figure(figsize=(12, 6)) # Plot: Imagem Original plt.subplot(2, 2, 1) plt.imshow(imagem_cinza, cmap='gray') plt.title('Imagem Original') plt.axis('off') # Plot: Máscara de Fourier (Passa Alta) plt.subplot(2, 2, 2) plt.imshow(mask_hp, cmap='gray') plt.title('Máscara Fourier - Passa Alta') plt.axis('off') # Plot: Imagem Reconstruída - Passa Alta plt.subplot(2, 2, 3) plt.imshow(img_back_hp, cmap='gray') plt.title('Imagem Reconstruída - Passa Alta') plt.axis('off') plt.show() # ============================================================================= # Filtro Passa Banda (Band-Pass) # ============================================================================= # Define os raios para o anel (donut): remove frequências muito baixas e muito altas radius_low_bp = 30 # frequências abaixo deste valor serão removidas radius_high_bp = 80 # frequências acima deste valor serão removidas mask_bp = np.zeros((rows, cols)) cv2.circle(mask_bp, (ccol, crow), radius_high_bp, 1, thickness=-1) cv2.circle(mask_bp, (ccol, crow), radius_low_bp, 0, thickness=-1) F_shift_bp = F_shift * mask_bp F_ishift_bp = np.fft.ifftshift(F_shift_bp) img_back_bp = np.fft.ifft2(F_ishift_bp) img_back_bp = np.abs(img_back_bp) plt.figure(figsize=(12, 6)) # Plot: Imagem Original plt.subplot(2, 2, 1) plt.imshow(imagem_cinza, cmap='gray') plt.title('Imagem Original') plt.axis('off') # Plot: Máscara de Fourier (Passa Banda) plt.subplot(2, 2, 2) plt.imshow(mask_bp, cmap='gray') plt.title('Máscara Fourier - Passa Banda') plt.axis('off') # Plot: Imagem Reconstruída - Passa Banda plt.subplot(2, 2, 3) plt.imshow(img_back_bp, cmap='gray') plt.title('Imagem Reconstruída - Passa Banda') plt.axis('off') plt.show()