MATLAB中对fft2输出的图像频谱做移位、取绝对值、对数变换的原因?
MATLAB FFT图像频谱绘制步骤答疑
核心结论
不是所有步骤都是必须执行的,教程中给出的流程完全是为了优化人眼观察的可视化效果、符合通用的频谱阅读习惯。如果仅做数值计算无需可视化,可直接跳过所有后续处理;如果需要绘制可解读的频谱图,再按需选择对应步骤。
各步骤的作用说明
你给出的可视化代码im2uint8(mat2gray(log(abs(fft_shifted)+1)))中各步骤的作用如下:
abs():如果要绘制常规幅度谱,这一步是必须的。fft2()的输出是复数矩阵,同时包含幅度和相位信息,我们常说的“频谱”默认指幅度谱,abs()的作用是提取复数的模值,得到每个频率分量的幅度大小。如果直接绘制复数矩阵,MATLAB会默认仅取实部渲染,结果完全不符合预期。log(XXX + 1):非必须但强烈建议添加的可视化优化步骤。自然图像的能量绝大多数集中在低频区域,低频幅度值可能是高频的数千甚至上万倍,如果直接用线性刻度绘制,只会看到中心亮斑,高频的细节会被完全淹没。对数变换可以压缩动态范围,让高低频的细节都能被观察到;加1是为了避免幅度为0时出现log(0)得到负无穷的错误。mat2gray():非必须的归一化步骤。作用是将对数变换后的数值范围显式映射到[0,1]的标准灰度区间,避免后续显示、存储时因为数值范围不匹配出现异常。如果仅用imshow()显示的话,函数本身会自动做极值映射,这一步可以省略。im2uint8():完全非必须的格式转换步骤。仅当你需要把频谱作为普通灰度图像存储、或者调用仅支持uint8格式输入的处理函数时才需要添加,仅做可视化的话可以直接跳过。fftshift():非必须但符合通用阅读习惯的步骤。你已经了解它的作用是将0频率分量移到频谱中心,让频谱呈现“中心低频、四周高频”的常规布局,尤其是你后续要做低通滤波作业,移位后直接在中心区域生成圆形掩模即可,无需额外计算四个角的低频区域位置,操作会方便很多。
低通滤波作业注意事项
后续做频域滤波时不要直接用可视化处理后的矩阵计算,正确流程如下:
- 对原图
fft2()得到的原始复数频域矩阵做fftshift()移位 - 生成对应的低通滤波器掩模,和移位后的频域矩阵直接相乘
- 对相乘后的结果做
ifftshift()反移位,再调用ifft2()转回空域,得到滤波后的图像 - 如需对比滤波前后的频谱,再分别对滤波前后的频域复数矩阵执行前述的可视化步骤绘图即可。
内容的提问来源于stack exchange,提问作者lauren
相关产品推荐
相关产品推荐

