应用场景
- 周期噪声去除:识别并滤除周期性干扰模式
- 纹理分析:从频域提取方向性和周期性特征
- 图像增强:频域锐化和平滑
- 模式识别:基于频率的纹理分类
使用示例
基础用法
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|))
重要说明
- 仅支持2D灰度或3D RGB,其他格式抛出ValueError
- 原始频谱用于重构,可视化频谱仅用于显示
- 掩码形状需与频率图(H,W)一致;0=置零,1=保留