基于MATLAB的TV、PM和ROF模型的实现代码
基于MATLAB的TV(总变差)、PM(Perona-Malik)和ROF(Rudin-Osher-Fatemi)模型的实现代码,包含图像去噪与重建功能
一、TV模型(总变差去噪)
1. 代码
function denoised = TV_denoise(noisy_img, lambda, iter)
% 输入参数:
% noisy_img: 含噪图像(灰度)
% lambda: 正则化参数(默认0.1)
% iter: 迭代次数(默认50)
% 输出:去噪图像
[rows, cols] = size(noisy_img);
denoised = double(noisy_img);
for i = 1:iter
% 计算梯度
[Ix, Iy] = gradient(denoised);
grad_mag = sqrt(Ix.^2 + Iy.^2 + eps);
% 更新总变差项
div_x = (Ix ./ grad_mag) .* (Ix.^2 + Iy.^2);
div_y = (Iy ./ grad_mag) .* (Ix.^2 + Iy.^2);
denoised = denoised + lambda * (div_x + div_y);
% 边界处理(零填充)
denoised(1,:) = denoised(2,:);
denoised(end,:) = denoised(end-1,:);
denoised(:,1) = denoised(:,2);
denoised(:,end) = denoised(:,end-1);
end
denoised = uint8(min(max(denoised,0),255));
end
% 示例调用
noisy_img = imread('noisy_cameraman.png');
denoised_img = TV_denoise(noisy_img, 0.1, 50);
imshow([noisy_img denoised_img]);
2. 关键参数说明
- lambda:控制平滑强度,值越大平滑越强(推荐0.05-0.2)
- iter:迭代次数影响收敛性(20-100次)
二、PM模型(Perona-Malik去噪)
1. 核心代码实现
function denoised = PM_denoise(noisy_img, K, lambda, iter)
% 输入参数:
% K: 对比度阈值(默认10)
% lambda: 时间步长(默认0.15)
% iter: 迭代次数(默认30)
[rows, cols] = size(noisy_img);
denoised = double(noisy_img);
for i = 1:iter
% 计算梯度
[Ix, Iy] = gradient(denoised);
grad_mag = sqrt(Ix.^2 + Iy.^2);
% 计算扩散系数(指数型)
c = exp(-(grad_mag/K).^2);
% 更新图像
div_x = (c(2:end,:) .* Ix(2:end,:) - c(1:end-1,:) .* Ix(1:end-1,:)) ./ (2*(1 + (Ix.^2 + Iy.^2)/K^2));
div_y = (c(:,2:end) .* Iy(:,2:end) - c(:,1:end-1) .* Iy(:,1:end-1)) ./ (2*(1 + (Ix.^2 + Iy.^2)/K^2));
denoised = denoised + lambda * (div_x + div_y);
% 边界处理(反射填充)
denoised(1,:) = denoised(2,:);
denoised(end,:) = denoised(end-1,:);
denoised(:,1) = denoised(:,2);
denoised(:,end) = denoised(:,end-1);
end
denoised = uint8(min(max(denoised,0),255));
end
% 示例调用
noisy_img = imread('noisy_moon.png');
denoised_img = PM_denoise(noisy_img, 15, 0.15, 30);
imshow([noisy_img denoised_img]);
2. 参数对比建议
| 参数 | TV模型 | PM模型 |
|---|---|---|
| lambda | 0.05-0.2 | 0.1-0.3 |
| K | 不适用 | 5-20 |
| 优势 | 保留强边缘 | 保留弱纹理 |
三、ROF模型(全变差重建)
1. 核心代码实现
function [denoised, u] = ROF_denoise(noisy_img, lambda, iter)
% 输入参数:
% lambda: 正则化参数(默认0.1)
% iter: 迭代次数(默认100)
[rows, cols] = size(noisy_img);
u = double(noisy_img);
f = u;
for i = 1:iter
% 计算梯度
[ux, uy] = gradient(f);
grad_mag = sqrt(ux.^2 + uy.^2 + eps);
% 更新方程
div = (ux.^2 .* ux + uy.^2 .* uy) ./ (grad_mag + eps) ...
+ (ux .* uy .* (uy - ux)) ./ (grad_mag + eps);
f = f + lambda * (div - u + noisy_img);
% 投影到可行域
f = max(min(f, 1), 0);
end
denoised = uint8(f);
end
% 示例调用
noisy_img = imread('noisy_lena.png');
[denoised, u] = ROF_denoise(noisy_img, 0.1, 100);
imshow([noisy_img denoised]);
2. 数学模型

其中f为含噪图像,u为重建图像。
参考代码 TV、PM、ROF模型代码,去噪、图像重建 www.youwenfan.com/contentcnk/64735.html
四、应用场景建议
- TV模型 医学影像(如MRI去噪) 遥感图像(保留地理特征)
- PM模型 自然场景图像(保留树叶纹理) 低光照图像增强
- ROF模型 艺术品修复(如油画去噪) 视频去噪(需逐帧处理)
五、代码优化技巧
-
加速方法 使用快速傅里叶变换(FFT)加速卷积 采用多尺度处理(如小波分解)
-
并行计算
parfor i = 1:iter % 并行迭代更新 end -
GPU加速
noisy_img_gpu = gpuArray(noisy_img); denoised_gpu = ROF_denoise(noisy_img_gpu, 0.1, 100); denoised = gather(denoised_gpu);
浙公网安备 33010602011771号