基于CDD曲率驱动扩散的图像修复工具箱
项目简介
本项目是一个基于MATLAB环境开发的图像修复(Inpainting)工具箱,核心算法采用曲率驱动扩散(Curvature Driven Diffusions, CDD)模型。该项目旨在通过偏微分方程(PDE)的数值求解,解决传统总变分(TV)模型在修复较大面积缺损时容易出现的“阶梯效应”和边缘断裂问题。
系统能够完全自主生成合成测试数据,模拟图像受损场景,并利用曲率信息引导扩散过程,使图像的等照度线(Isophotes)能够保持几何连通性,从而有效地修复图像中的划痕、裂缝和块状缺失。
功能特性
- CDD模型核心算法:实现了基于曲率驱动的非线性各向异性扩散方程,利用有限差分法对PDE进行数值离散求解。
- 自包含数据生成:无需外部图片文件,代码内置合成图像生成器(包含渐变背景、圆形几何体、矩形色块)以及复杂损伤掩膜生成器(模拟随机线性裂缝和块状污渍)。
- 多通道独立修复:支持RGB彩色图像处理,对R、G、B三个通道分别进行PDE演化求解,最后合成彩色修复结果。
- 数值稳定性控制:引入正则化参数(epsilon)和数值截断机制,防止梯度或曲率计算过程中的除零错误及溢出。
- 实时质量评估:集成客观评价指标计算模块,能够计算峰值信噪比(PSNR)和结构相似性(SSIM)。
- 全方位可视化:在单个窗口中展示原始真值、受损图像、掩膜、修复结果、残差热力图以及PSNR收敛曲线。
系统要求
- MATLAB:推荐使用 R2016b 及以上版本。
- 工具箱:Image Processing Toolbox(用于基础图像操作和显示)。
- 硬件:标准PC即可,无需GPU加速。
使用方法
- 直接在MATLAB环境中打开并运行主程序文件。
- 程序将自动执行以下流程:
* 生成 $256 times 256$ 分辨率的合成彩色图像作为真值(Ground Truth)。
* 生成包含随机划痕和矩形遮挡的二值掩膜(Mask)。
* 将掩膜区域填充为随机噪声,模拟受损图像。
* 启动CDD求解器进行迭代修复。
* 输出修复耗时、最终PSNR及SSIM指标。
* 弹出图形窗口展示修复结果对比及分析图表。
算法实现细节
本项目完全基于提供的 main.m 代码实现,其核心算法逻辑如下:
1. 偏微分方程求解器 (CDD Solver)
求解器位于
cdd_solver 函数中,采用显式迭代方案求解图像 $u$。
- 导数计算:利用中心差分法(Central Difference)计算图像的一阶偏导数($u_x, u_y$)和二阶偏导数($u_{xx}, u_{yy}, u_{xy}$)。
- 曲率计算:根据一阶和二阶导数计算平均曲率 $K$。公式实现为:
$K = frac{u_x^2 u_{yy} - 2u_x u_y u_{xy} + u_y^2 u_{xx}}{(|nabla u|^2 + epsilon)^{1.5}}$
为了防止数值不稳定,代码中对异常大的曲率值进行了截断处理。
- 扩散系数构造:CDD模型的核心在于扩散系数 $D$ 取决于曲率。代码中定义扩散系数为 $D = frac{|K|^a}{|nabla u|}$,其中 $a$ 为曲率驱动参数(默认为1.0),$epsilon$ 用于正则化梯度模长。
- 数值更新方案:采用了一种鲁棒的数值离散格式。并未直接展开散度项,而是通过计算加权的拉普拉斯项来更新图像。具体做法是计算中心像素与四邻域像素的差值,并乘以计算出的扩散系数,以此作为迭代更新量
delta_u。 - 边界条件与掩膜约束:
*
Neumann边界:在差分计算时,使用
padarray 对图像边缘进行对称填充。
*
Dirichlet边界(Mask约束):在每次迭代更新后,仅强制更新掩膜区域(Mask=1)的像素值,而非掩膜区域(已知区域)保持原始观测值不变,确保数据保真度。
2. 多通道处理
算法对彩色图像的三个通道(R, G, B)进行循环遍历,每个通道被视为独立的标量场进行上述PDE求解,最终合并为彩色结果。
3. 数据与掩膜生成
generate_synthetic_image:构建了一个具有对角渐变背景的图像,并在其上叠加了红色的圆形和蓝色的矩形,用于测试算法对几何边缘和平滑区域的修复能力。generate_mask:生成两类损伤:
*
随机划痕:通过随机生成的贝塞尔曲线或线段(代码中为加粗的直线段)模拟裂缝。
*
块状遮挡:在图像中心区域生成一个较大的矩形块,模拟严重的数据丢失。
4. 评估与可视化
- 残差显示:代码计算真值与修复结果的绝对差值,并将其归一化后通过
jet 色图显示,直观反映修复误差的分布。 - 收敛分析:在迭代过程中记录PSNR值,并在最后绘制出PSNR随迭代次数(每50次采样)变化的曲线,用于分析算法的收敛速度。
参数配置说明
在主程序中可调整以下关键参数以观察不同效果:
params.iter_max:最大迭代次数(默认500),决定修复过程的持续时间。params.dt:时间步长(默认0.1),需满足CFL条件以保证数值稳定性。params.curvature_a:曲率驱动参数。默认为1.0(标准CDD);若设为0,算法将退化为近似TV模型的行为。params.epsilon:正则化微小量(默认1e-6),用于防止除零错误。