本项目实现了TV-L1/2 ADMM去噪算法和PnP-ADMM去噪算法。
部分运行效果:
使用方法如下:
git clone https://github.com/BugNotFoundX/image_denoise.git
cd image_denoise
conda create -n denoise python=3.12
conda activate denoise
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
pip install -r requirements.txt
python main.py
文件目录
.
├── main.py // 主程序入口(可选不同方法,详见代码)
├── PnP.py // PnP-ADMM算法实现(BM3D和DnCNN两种去噪器)
├── TotalVariation.py // TV-L1/2 ADMM去噪算法实现
├── utils.py // 工具函数和
├── Method.py // Method基类
├── model.pth // DnCNN模型
├── model.py // DnCNN模型类
├── README.md // 项目说明文档
├── image.png // 测试图片
├── .gitignore // Git忽略文件
├── denoised_comparison.png // 去噪结果对比图(运行main.py后更新)
└── requirements.txt // python依赖
Tip:
- 代码中的命名一般使用公式中的符号,便于理解。
- github的公式渲染可能不支持所有公式,建议使用本地Markdown编辑器查看,本项目中使用VSCode编写和查看(typora也可正常查看)。
下文介绍了本项目实现的算法及其推导过程,符号含义如下表:
符号 | 含义 |
---|---|
去噪后的图像 | |
输入图像 | |
正则化参数 | |
图像的梯度 | |
图像的散度 | |
傅里叶变换 | |
傅里叶逆变换 | |
拉格朗日函数 | |
拉普拉斯算子的傅里叶变换 | |
L1范数(曼哈顿范数) | |
L2范数(欧几里得范数) |
TV-L1去噪算法是一种基于总变差(Total Variation, TV)和L1范数的图像去噪方法。其主要思想是通过最小化图像的总变差来保留图像的边缘信息,同时使用L1范数来减少噪声。
该算法的目标是通过交替方向乘子法(ADMM)来求解以下优化问题[1]:
其中,$f$ 是输入图像,$u$ 是去噪后的图像,$\lambda$ 是正则化参数,$\nabla u$ 表示图像的梯度。
ADMM 形式:
对应的拉格朗日增广函数为(通过配方吸收一次项):
$$ L_{\rho}(u,z,y,a,b)=|z|{1}+\lambda|y|{1}+\frac{\beta}{2}|z-u+f+\frac{a}{\beta}|^{2}+\frac{\alpha}{2}|y-\nabla u+\frac{b}{\alpha}|^{2} $$
参数更新:
1、u 更新:
2、z 更新:
(1) if
(2) if
(3) if
(1)+(2)+(3): 结果为软阈值函数
3、y 更新:
(1) if
(2) if
(3) if
(1)+(2)+(3):结果为软阈值函数
4、a 更新:
5、b 更新:
6、
7、
一般的
TV-L2去噪算法是一种基于总变差(Total Variation, TV)和L2范数的图像去噪方法。其主要思想是通过最小化图像的总变差来保留图像的边缘信息,同时使用L2范数来减少噪声。
该算法的目标是通过交替方向乘子法(ADMM)来求解以下优化问题:
ADMM 形式:
对应的拉格朗日增广函数为(通过配方吸收一次项):
参数更新: 1、u 更新:
2、z 更新:
令
3、y 更新:
(1) if
(2) if
(3) if
(1)+(2)+(3):结果为软阈值函数
4、a 更新:
5、b 更新:
6、
7、
一般的
PnP-ADMM(Plug-and-Play Alternating Direction Method of Multipliers)算法是一种结合了ADMM和深度学习的图像去噪方法。该算法通过引入深度学习模型作为先验知识,来提高去噪效果。
在TV-L2的基础上,PnP-ADMM算法将深度学习模型作为一个黑盒函数$g$,用于更新去噪图像。其优化问题可以表示为[2]:
该式的Lagrangian函数为:
根据ADMM更新参数:
其中
其中
此外,可以将
关于惩罚参数
- 对于所有的迭代
$k$ ,$\gamma_k$ 都取同一个常量,即$\gamma_k = \gamma$ ,其中$\gamma > 1$ 。 - 自适应地选取
$\gamma_k$ ,选取规则可以是:
其中,$\eta \in (0,1)$,$\gamma > 1$,
综上所述,该 PnP-ADMM 的迭代模型(使用 scaled dual variable
代码中PnP_BMD3D
和PnP_CNN
的去噪模型分别为BM3D
[3]和DnCNN
[4]
Tips:
- 关于
$\gamma$ 的选取:该参数影响CNN去噪强度,图片的初始噪声越大,初始值应该越大,本项目中当噪声的$\sigma=0.07$ ,($\rho=0.07,\lambda=1$ ),$\gamma_0$ 较好的取值大约为$10$ 左右。 - 因为不明原因使用BM3D该方法的表现并不好,论文[5]中似乎效果也不理想
- 增大
$\gamma$ 的初始值也可以增大去噪强度(图片看起来也会越油腻,对TV方法也生效)
- DnCNN:https://github.com/cszn/DnCNN
- TV_L1_Denoising_via_ADMM:https://github.com/Git-H2K/TV_L1_Denoising_via_ADMM
- pypher:https://github.com/aboucaud/pypher
[1] QIN Z T, GOLDFARB D, MA S. An alternating direction method for total variation denoising[J/OL]. Optimization Methods Software, 2015, 30(3): 594-615. DOI:10.1080/10556788.2014.955100.
[2] CHAN S H, WANG X, ELGENDY O A. Plug-and-Play ADMM for Image Restoration: Fixed Point Convergence and Applications[A/OL]. arXiv, 2016[2025-06-13]. http://arxiv.org/abs/1605.01710. DOI:10.48550/arXiv.1605.01710.
[3] DABOV K, FOI A, KATKOVNIK V, 等. Image Denoising by Sparse 3-D Transform-Domain Collaborative Filtering[J/OL]. IEEE Transactions on Image Processing, 2007, 16(8): 2080-2095. DOI:10.1109/TIP.2007.901238.
[4] ZHANG K, ZUO W, CHEN Y, 等. Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising[J/OL]. IEEE Transactions on Image Processing, 2017, 26(7): 3142-3155. DOI:10.1109/TIP.2017.2662206.
[5] 魏俊豪. 基于ADMM的图像去噪算法研究[D]. 黑龙江:哈尔滨工程大学,2020.