傅里叶分析 - CFAImageFourier

2D FFT频谱分析、自定义掩码滤波和图像重构

应用场景

使用示例

基础用法

import cv2, numpy as np from FreeAeonFractal.FAImageFourier import CFAImageFourier image = cv2.imread('./images/face.png') fourier = CFAImageFourier(image) # __init__中完成FFT raw_mag, raw_phase = fourier.get_raw_spectrum() # 用于重构 mag_disp, phase_disp = fourier.get_display_spectrum(alpha=1.5) # 用于可视化 full_reconstructed = fourier.get_reconstruct() fourier.plot( raw_magnitude_disp=mag_disp, raw_phase_disp=phase_disp, full_reconstructed=full_reconstructed )

自定义频率掩码滤波

h, w = raw_mag[0].shape Y, X = np.ogrid[:h, :w] mask = ((X % 2 == 1) & (Y % 2 == 1)).astype(np.uint8) # 示例掩码 customized_mag = raw_mag * mask customized_phase = raw_phase * mask custom_mag_disp, custom_phase_disp = fourier.get_display_spectrum( alpha=1.5, magnitude=customized_mag, phase=customized_phase) masked_reconstructed = fourier.extract_by_freq_mask(mask) fourier.plot( raw_magnitude_disp=mag_disp, raw_phase_disp=phase_disp, customized_magnitude_disp=custom_mag_disp, customized_phase_disp=custom_phase_disp, full_reconstructed=full_reconstructed, mask_reconstructed=masked_reconstructed )

低通滤波(平滑/模糊)

cy, cx = h // 2, w // 2 radius = 30 Y, X = np.ogrid[:h, :w] mask = ((X - cx)**2 + (Y - cy)**2 <= radius**2).astype(np.uint8) result = fourier.extract_by_freq_mask(mask)

类说明

CFAImageFourier

__init__(image)

支持灰度(H,W)或RGB(H,W,3)。FFT在初始化时完成;灰度存储一对幅度/相位,RGB存储三对(每通道一对)。

get_raw_spectrum()

返回原始(未对数缩放)幅度和相位列表。仅用于重构,不用于可视化。

get_display_spectrum(alpha=1.0, beta=0, magnitude, phase)

返回对数缩放的8位可视化图像。可传入自定义幅度/相位可视化掩码后的频谱。

get_reconstruct(magnitude, phase)

IFFT(IFFTSHIFT(mag * exp(1j * phase))),归一化到[0,255]。

extract_by_freq_mask(mask_mag, mask_phase)

对频域应用二值掩码后重构。掩码形状需与频率图(H,W)相同。

plot(...)

2行网格并排展示:原始图像、幅度、相位、定制幅度、定制相位、全重构、掩码重构。

算法说明

# 正向FFT F = np.fft.fft2(image) F_shift = np.fft.fftshift(F) # DC分量移到中心 magnitude = |F_shift|, phase = angle(F_shift) # 重构 F_shift = magnitude * exp(1j * phase) img = Re(np.fft.ifft2(np.fft.ifftshift(F_shift))) # 可视化增强 display = normalize(log(1 + |magnitude|))

重要说明

  1. 仅支持2D灰度或3D RGB,其他格式抛出ValueError
  2. 原始频谱用于重构,可视化频谱仅用于显示
  3. 掩码形状需与频率图(H,W)一致;0=置零,1=保留