基于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

四、应用场景建议

  1. TV模型 医学影像(如MRI去噪) 遥感图像(保留地理特征)
  2. PM模型 自然场景图像(保留树叶纹理) 低光照图像增强
  3. ROF模型 艺术品修复(如油画去噪) 视频去噪(需逐帧处理)

五、代码优化技巧

  1. 加速方法 使用快速傅里叶变换(FFT)加速卷积 采用多尺度处理(如小波分解)

  2. 并行计算

    parfor i = 1:iter
        % 并行迭代更新
    end
    
  3. GPU加速

    noisy_img_gpu = gpuArray(noisy_img);
    denoised_gpu = ROF_denoise(noisy_img_gpu, 0.1, 100);
    denoised = gather(denoised_gpu);
    
posted @ 2025-10-29 16:34  csoe9999  阅读(11)  评论(0)    收藏  举报