基于功率谱分析的图像清晰度评价算法
项目介绍
本项目是一个基于MATLAB开发的图像处理系统,旨在通过频率域分析技术实现对图像清晰度的客观量化评价。系统利用二维快速傅里叶变换(2D-FFT)将图像从空间域转换至频率域,并基于数字信号处理理论——即清晰图像包含更多高频细节(如边缘、纹理),在频域表现为更高的能量分布——来区分清晰与模糊图像。
该算法不依赖参考图像(No-Reference),通过计算去除直流分量后的功率谱能量总和作为核心评价指标。该方案可用于自动对焦验证、镜头质量检测及图像质量筛选等场景。
功能特性
- 全自动数据生成:程序内置测试数据生成器,无需外部文件即可运行。能自动合成包含高频纹理(棋盘格+噪声)的清晰图像样本,以及经过高斯滤波模拟的模糊图像样本。
- 频域转换与分析:使用FFT2算法进行空间域到频率域的转换,并计算功率谱(Power Spectrum)。
- 抗干扰评分机制:采用特定的掩膜算法去除主要代表平均亮度的直流分量(DC),专注于计算反映纹理细节的交流分量能量,使评价结果更鲁棒。
- 多维度可视化:提供包含原始图像、二维对数频谱图(俯视图)以及三维频谱能量图(立体图)的对比展示,直观反映清晰度差异。
- 性能评估:实时计算并输出处理耗时,便于评估算法效率。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 将项目代码保存至MATLAB当前工作路径。
- 直接运行主函数。
- 控制台输出:观察命令行窗口中显示的清晰图像与模糊图像的能量得分、耗时及清晰度倍率对比结论。
- 图形输出:查看弹出的可视化窗口,对比两组图像在空间域与频率域的形态差异。
核心算法实现逻辑
根据实际代码,本项目的处理流程如下:
1. 数据准备阶段
程序启动后,首先调用内部生成函数建立基准测试数据。
- 清晰样本:构建一个512x512分辨率的棋盘格图案,并叠加随机高频噪声,模拟丰富的边缘和纹理细节。
- 模糊样本:对上述清晰样本应用Sigma=5的大核高斯模糊滤波器,模拟失焦或运动模糊效果,人为地衰减高频信息。
2. 频域分析与评分(核心处理)
针对每一幅输入图像,执行以下严谨的信号处理步骤:
- 预处理:将图像转换为灰度图(如需要)并强制转换为双精度浮点型(double),以保证FFT计算精度。
- 傅里叶变换:执行二维快速傅里叶变换(
fft2),获取复数频谱。 - 频谱中心化:利用
fftshift将零频(直流)分量移至频谱矩阵中心,便于观察和滤波。 - 功率谱计算:计算频谱幅度的平方(实部与虚部的平方和),得到功率谱密度。
- 特征提取(关键步骤):
* 定位频谱中心坐标。
* 构建一个3x3的窗口掩膜,将中心的直流分量(DC)及极低频区域强制置零。
*
理由:直流分量数值巨大且主要反映背景亮度,去除它能避免亮度差异掩盖了代表清晰度的高频纹理变化。
- 得分计算:对经过掩膜处理后的功率谱矩阵进行全元素求和,该总值即为图像的“清晰度得分”。
3. 先验逻辑判定
程序对比清晰图与模糊图的得分。若清晰图得分显著高于模糊图(通常高出一个数量级以上),则判定算法有效,并输出具体的能量倍率差;否则提示数据异常。
4. 结果可视化
构建2行3列的绘图窗口进行详细对比:
- 第一列:展示空间域的清晰与模糊原图。
- 第二列:展示二维对数频谱图。使用对数变换
log(1 + |F|) 增强显示低幅度的频谱细节,便于人眼观察频率分布。 - 第三列:展示三维网格图(Mesh)。将频率能量以高度形式可视化,清晰图像通常在中心周围呈现更宽阔、更高的“山峰”,而模糊图像则衰减迅速,呈现“尖细”状。
关键函数说明
主控制逻辑
负责整个流程的编排,包括清理环境、调用数据生成、分别对两幅图像调用分析函数、打印对比日志以及调用绘图函数。
图像清晰度分析函数 (analyze_image_sharpness)
这是算法的运算核心。它封装了从图像输入到得分输出的完整链路。
- 输入:任意灰度或彩色图像。
- 输出:移位后的幅度谱、用于显示的对数谱、标量清晰度得分、计算耗时。
- 特点:内部集成了计时器(
tic/toc)和特定的低频屏蔽逻辑。
测试图像生成函数 (generate_test_images)
负责创建合成数据。
- 利用
meshgrid 和取模运算生成标准的棋盘格。 - 利用
randn 生成噪声模拟纹理。 - 利用
imgaussfilt 模拟光学模糊。
结果可视化函数 (visualize_results)
负责图形界面的渲染。
- 统一配置了
colormap jet 以增强热力图的可读性。 - 同步了模糊图像与清晰图像的坐标轴范围,确保视觉对比的公平性。
- 在三维视图中设置了特定的视角(45度方位角和俯仰角),以获得最佳的频谱观察效果。