基于Wrapping算法的快速离散曲波变换(FDCT)系统
项目简介
本项目是一个基于MATLAB实现的快速离散曲波变换(Fast Discrete Curvelet Transform, FDCT)演示系统。项目采用
Wrapping(卷绕)算法,实现了二维图像在频率域的多尺度、多方向稀疏分解。相较于USFFT方法,Wrapping算法通过周期性卷绕技术实现了更快的计算速度和更紧凑的系数表达。
该系统不仅实现了曲波变换的核心算法逻辑,还构建了一个完整的信号处理应用流程,展示了曲波变换在捕捉图像边缘、纹理特征以及非线性去噪方面的优势。
功能特性
1. 合成数据生成
系统内置了测试图像生成模块,能够自动生成包含多种特征的 $256 times 256$ 仿真图像:
- 平滑区域:由于高斯函数生成的中心亮度区域。
- 几何边缘:方形区域产生的阶跃边缘。
- 高频纹理:模拟指纹或织物的正弦/余弦波纹理。
- 噪声模拟:可添加指定强度(默认 $sigma=20$)的高斯白噪声用于测试鲁棒性。
2. 正向曲波变换 (FDCT via Wrapping)
实现了基于Wrapping方法的正向变换流程:
- 支持实数变换与复数变换模式切换。
- 支持自适应尺度层数计算(基于图像尺寸的$log_2$关系)。
- 将图像分解为由粗到细的多个尺度(Scale),并在细节层将频率域划分为多个角度楔形(Wedge)。
- 能够处理最细尺度(Finest Scale)的小波模式或曲波模式选择。
3. 硬阈值去噪
演示了基于曲波系数的图像去噪能力:
- 噪声估计:利用中位数绝对偏差(MAD)对除低频层外的每个子带进行噪声水平估算。
- 非线性处理:采用硬阈值(Hard Thresholding)策略,保留主要特征系数,抑制噪声系数。
- 层级保护:通过跳过最粗尺度(Coarsest Scale),保护图像的基本轮廓和低频信息不被破坏。
4. 逆向曲波变换与重构
实现了基于Wrapping方法的逆向变换流程:
- 从修改后的曲波系数元胞数组中高精度重建图像。
- 支持完美重构(Perfect Reconstruction)验证,确保算法实现的数学正确性。
5. 可视化与评估
- 直观展示原始图像、含噪图像与去噪后图像。
- 提供曲波系数的可视化接口。
- 量化评估:计算重构后的峰值信噪比(PSNR)及相对重构误差。
系统要求
- MATLAB R2016b 或更高版本。
- Image Processing Toolbox(推荐,用于基础图像显示)。
- 内存:建议 4GB 以上,以支持多层级复数系数的存储。
核心算法与代码实现分析
本项目的所有核心逻辑均封装在单一脚本中,主要函数及实现细节如下:
1. 主流程控制 (main)
这是系统的入口函数,负责协调整个处理管线:
- 参数配置:定义图像尺寸、噪声水平、变换参数(如
nbscales, nbangles_coarse)。 - 管线执行:按顺序调用数据生成 $rightarrow$ 正向变换 $rightarrow$ 阈值处理 $rightarrow$ 逆向变换 $rightarrow$ 误差计算。
- 结果展示:利用
subplot 对比显示处理前后的图像,并在控制台输出运行时间和PSNR指标。
2. 正向变换核心 (fdct_wrapping)
该函数实现了FDCT的具体算法步骤:
- FFT预处理:对输入图像进行二维快速傅里叶变换并移频,将计算转移到频率域。
- 多尺度循环:
*
低频处理:通过窗函数提取频谱中心区域,构建最粗尺度系数。
*
高频细节处理:对于中间尺度,通过角度循环,定义不同方向的楔形窗函数。
*
Wrapping操作:这是算法的关键,将倾斜的频率楔形区域通过周期性平移(卷绕)映射到中心矩形区域,从而使得可以使用标准IFFT处理非矩形支撑区。
- 系数存储:输出结构化元胞数组
C{scale}{angle}。
3. 逆向变换核心 (ifdct_wrapping)
该函数执行正向变换的逆过程:
- 频域累加:初始化全零频域矩阵,逐步累加各尺度恢复回来的频率分量。
- 反向处理:对每个尺度的系数进行Wrap的逆操作(Unwrap)和加窗处理,将其放回其在全频谱中的原始位置。
- 最终重构:对累加完成的频谱进行二维逆傅里叶变换(IFFT),取实部得到重构图像。
4. 去噪逻辑 details
代码中通过双重循环遍历系数
C(跳过
C{1}):
- 计算子带系数的中位数
median(coeff)。 - 利用公式
median(|coeff - median|) / 0.6745 估算噪声标准差。 - 设定阈值为
3 * noise_est,将绝对值低于该阈值的系数置零。
使用方法
- 确保MATLAB环境已准备就绪。
- 将包含代码的文件保存为
.m 文件(例如 main.m,若作为函数运行需确保文件名与函数名一致或直接运行脚本内容)。 - 在MATLAB命令窗口输入文件名或点击“运行”按钮。
- 观察弹出的图形窗口,分别显示:
* 输入数据(原始与含噪)。
* 曲波系数可视化图。
* 去噪结果对比(含PSNR数值)。
- 控制台将输出正向/逆向变换的耗时以及通过完美重构检查得到的相对误差(理论上应接近机器精度,如 $10^{-16}$ 数量级)。