基于TV模型利用Bregman分裂算法迭代对图像进行滤波和复原处理

news/2025/10/21 9:56:43/文章来源:https://www.cnblogs.com/gwerwr811111/p/19154231

基于全变分(Total Variation, TV)模型和 Bregman迭代分裂算法 进行图像去噪和复原的原理与实现。

第一部分:理论基础

1. 全变分(TV)模型

由Rudin, Osher和Fatemi提出(ROF模型),是图像处理领域的里程碑。其核心思想是:自然图像通常是分段平滑的,即具有稀疏的梯度。TV模型通过最小化图像梯度的L1范数来实现去噪,能在有效去除噪声的同时,很好地保持图像的边缘和结构信息。

对于一幅被噪声污染的观测图像 f,我们寻求恢复的真实图像 u 可以通过求解以下最优化问题得到:

$$ \min_u TV(u) + \frac{\lambda}{2} |u - f|_2^2 $$

其中:

  • \(TV(u)\) 是图像 u 的全变分。通常有两种形式:
    • 各向同性TV (Isotropic TV): \(TV_I(u) = \int_\Omega \sqrt{|\nabla u|^2 + \epsilon} dxdy \approx \sum_{i,j} \sqrt{(u_{x})_{i,j}^2 + (u_{y})_{i,j}^2 + \epsilon}\) (更常用)
    • 各向异性TV (Anisotropic TV): \(TV_A(u) = \int_\Omega |\nabla u| dxdy = \sum_{i,j} |(u_{x})_{i,j}| + |(u_{y})_{i,j}|\)
    • (u_x, u_y) 是图像在x和y方向的梯度(差分),ε 是一个很小的正数,防止分母为零。
  • \(\frac{\lambda}{2} \|u - f\|_2^2\)数据保真项(Fidelity Term),它约束恢复的图像 u 不能与观测图像 f 相差太大。
  • \(\lambda\) 是正则化参数,用于平衡TV正则项数据保真项λ 越大,去噪能力越强,但可能导致图像过度平滑(“卡通效应”);λ 越小,保真度越高,但去噪效果可能变差。

2. Bregman迭代与分裂算法

直接求解上述最小化问题比较困难,因为TV项是不可微的。Bregman迭代和算子分裂技巧可以有效地解决这个问题。

  • Bregman距离: 对于凸函数 J(u),其Bregman距离定义为:
    \(D_J^p(u, v) = J(u) - J(v) - \langle p, u-v \rangle\)
    其中 p ∈ ∂J(v)Jv 点的次梯度。它不是真正的距离,但衡量了 uv 的差异。

  • Bregman迭代: 用于解决 min_u J(u) + H(u) 这类问题。其迭代格式为:

    \[\begin{aligned} u^{k+1} &= \arg\min_u D_J^{p^k}(u, u^k) + H(u) \\ p^{k+1} &= p^k - \nabla H(u^{k+1}) \in \partial J(u^{k+1}) \end{aligned} \]

    应用于TV去噪模型(J(u)=TV(u), H(u)=λ/2 ||u-f||_2^2)时,它通常比直接最小化原问题收敛得更快、效果更好。

  • 分裂Bregman算法 (Split Bregman)
    这是求解L1正则化问题的一种极其高效的方法。它的核心思想是变量分裂,引入辅助变量 d 来将梯度项 ∇u 与主变量 u 解耦,从而将一个复杂问题分解为几个简单的、可高效求解的子问题。

    对于TV模型,我们引入 d ≈ ∇u。问题重写为:

    \[\min_{u, d} \|d\|_1 + \frac{\lambda}{2} \|u-f\|_2^2 \quad \text{s.t.} \quad d = \nabla u \]

    利用Bregman迭代,这个约束优化问题转化为一系列无约束子问题的迭代求解:

    \[(u^{k+1}, d^{k+1}) = \arg\min_{u, d} \|d\|_1 + \frac{\lambda}{2} \|u-f\|_2^2 + \frac{\mu}{2} \|d - \nabla u - b^k\|_2^2 \]

    其中 b^k 是Bregman参数,其更新规则为 b^{k+1} = b^k + (\nabla u^{k+1} - d^{k+1})

    分裂Bregman算法的巨大优势在于,它可以按照变量 ud 进行交替最小化(Alternating Minimization),使得每个子问题都有解析解或非常容易求解:

    1. u-子问题

      \[u^{k+1} = \arg\min_u \frac{\lambda}{2} \|u-f\|_2^2 + \frac{\mu}{2} \|d^k - \nabla u - b^k\|_2^2 \]

      这是一个可微的二次凸优化问题。最有效的解法是使用高斯-赛德尔迭代(Gauss-Seidel Iteration) 或通过傅里叶变换求解。其最优条件是一个泊松方程:

      \[(\lambda I - \mu \Delta) u^{k+1} = \lambda f + \mu \nabla^T (d^k - b^k) \]

      Δ 是拉普拉斯算子,∇^T 是散度算子)

    2. d-子问题

      \[d^{k+1} = \arg\min_d \|d\|_1 + \frac{\mu}{2} \|d - \nabla u^{k+1} - b^k\|_2^2 \]

      这个问题的解可以通过软阈值收缩(Soft Thresholding) 算子给出:

      \[d^{k+1} = \text{softThresh}(\nabla u^{k+1} + b^k, 1/\mu) = \frac{\nabla u^{k+1} + b^k}{|\nabla u^{k+1} + b^k|} \cdot \max(|\nabla u^{k+1} + b^k| - 1/\mu, 0) \]

    3. b-更新

      \[b^{k+1} = b^k + (\nabla u^{k+1} - d^{k+1}) \]


第二部分:MATLAB代码实现(各向同性TV)

使用Split Bregman算法实现灰度图像TV去噪的详细代码。

function u_denoised = tvdenoise_split_bregman(f, lambda, mu, max_iter, tol)
%TVDENOISE_SPLIT_BREGMAN Split Bregman algorithm for isotropic TV denoising.
%   u = TVDENOISE_SPLIT_BREGMAN(f, lambda, mu, max_iter, tol) denoises
%   input image f using Total Variation regularization.
%
%   Input:
%       f       : Noisy input image (grayscale, double in [0,1])
%       lambda  : Fidelity term weight (e.g., 0.05)
%       mu      : Penalty parameter for constraint d = grad(u) (e.g., 1.0)
%       max_iter: Maximum number of iterations (e.g., 100)
%       tol     : Tolerance for stopping criterion (e.g., 1e-5)
%
%   Output:
%       u_denoised : Denoised image.if nargin < 5tol = 1e-5;endif nargin < 4max_iter = 100;endif nargin < 3mu = 1.0;endif nargin < 2lambda = 0.05;end[M, N] = size(f);u = f; % Initialize u with the noisy imagedx = zeros(M, N); % Auxiliary variable for horizontal gradientdy = zeros(M, N); % Auxiliary variable for vertical gradientbx = zeros(M, N); % Bregman parameter for dxby = zeros(M, N); % Bregman parameter for dy% Precompute necessary Laplacian operator for the u-subproblem% The system to solve is: (lambda * I - mu * Laplacian) u = rhs% We'll use a single Gauss-Seidel update per iteration for simplicity.% Precompute the denominator for the GS update (constant for all pixels)denom_G = 1 / (lambda + 4 * mu); % For the isotropic model using 4 neighborsfprintf('Starting Split Bregman TV denoising...\n');for k = 1:max_iteru_prev = u;% -------------------------------% 1. Solve u-subproblem (using Gauss-Seidel)% -------------------------------% The equation for each pixel (i,j):% (lambda + 4*mu) * u(i,j) - mu*(u(i+1,j)+u(i-1,j)+u(i,j+1)+u(i,j-1)) % = lambda * f(i,j) + mu * [ (dx(i,j)-dx(i-1,j) - bx(i,j)+bx(i-1,j)) %                           + (dy(i,j)-dy(i,j-1) - by(i,j)+by(i,j-1)) ]% We use a single pass of Gauss-Seidel iteration.% Compute the divergence of (d - b)div_db = divergence(dx - bx, dy - by);% Form the right-hand side for the GS equationrhs = lambda * f + mu * div_db;% Perform one Gauss-Seidel sweep on uu = gauss_seidel_step(u, rhs, lambda, mu, denom_G);% Ensure Neumann boundary conditions (reflective)u = enforce_neumann_bc(u);% -------------------------------% 2. Solve d-subproblem (Soft Thresholding)% -------------------------------[ux, uy] = gradient(u); % Compute gradient of updated u% We are minimizing for d: ||d||_1 + (mu/2) * ||d - (grad(u) + b)||^2% The solution is soft thresholding:% d = softThresh( grad(u) + b, 1/mu )sx = ux + bx;sy = uy + by;norm_s = sqrt(sx.^2 + sy.^2 + eps); % Magnitude, add eps to avoid division by zero% Soft thresholding formulathreshold = 1 / mu;shrink_factor = max(norm_s - threshold, 0) ./ norm_s;dx = shrink_factor .* sx;dy = shrink_factor .* sy;% -------------------------------% 3. Update Bregman parameters (b)% -------------------------------bx = bx + (ux - dx);by = by + (uy - dy);% -------------------------------% 4. Check for convergence% -------------------------------diff_u = norm(u - u_prev, 'fro') / norm(u, 'fro');if mod(k, 10) == 0fprintf('  Iteration %4d, relative change: %.6f\n', k, diff_u);endif diff_u < tolfprintf('Converged after %d iterations.\n', k);break;endendif k == max_iterfprintf('Reached maximum iterations (%d).\n', max_iter);endu_denoised = u;
end%% Helper function: Gauss-Seidel update step
function u_new = gauss_seidel_step(u, rhs, lambda, mu, denom)
% One iteration of Gauss-Seidel for the system (lambda*I - mu*Laplacian) u = rhs[M, N] = size(u);u_new = u;for i = 2:M-1for j = 2:N-1% Gather neighbors (using updated values where available)neighbor_sum = u_new(i-1, j) + u_new(i+1, j) + u_new(i, j-1) + u_new(i, j+1);% Update current pixelu_new(i, j) = (rhs(i, j) + mu * neighbor_sum) * denom;endend
end%% Helper function: Enforce Neumann boundary conditions (zero normal derivative)
function u = enforce_neumann_bc(u)u(1, :) = u(2, :);     % Top borderu(end, :) = u(end-1, :); % Bottom borderu(:, 1) = u(:, 2);     % Left borderu(:, end) = u(:, end-1); % Right border
end%% Helper function: Compute divergence of a vector field (dx, dy)
function div = divergence(dx, dy)
% Computes div = d(dx)/dx + d(dy)/dy using finite differences[M, N] = size(dx);div = zeros(M, N);% Interior pointsdiv(2:M-1, 2:N-1) = (dx(2:M-1, 3:N) - dx(2:M-1, 2:N-1)) + ... % d(dx)/dx(dy(3:M, 2:N-1) - dy(2:M-1, 2:N-1));       % d(dy)/dy% Handle boundaries simply (approximate)div = [dx(:, 1), (dx(:, 3:end) - dx(:, 1:end-2)), -dx(:, end-1)] / 2 + ...[dy(1, :); (dy(3:end, :) - dy(1:end-2, :)); -dy(end-1, :)] / 2;
end

主脚本:测试算法

%% Main script to test TV denoising with Split Bregman
clc; clear; close all;% 1. Read and prepare image
I_clean = im2double(imread('cameraman.tif'));
% I_clean = im2double(rgb2gray(imread('your_image.jpg')));% 2. Add noise
noise_std = 0.1; % Standard deviation of Gaussian noise
I_noisy = imnoise(I_clean, 'gaussian', 0, noise_std^2);% 3. Apply TV denoising
lambda = 0.05; % Fidelity weight. Increase for more denoising (but more cartoonish)
mu = 1.0;      % Penalty parameter. Usually set around 1.0, can be tuned.
max_iter = 200;
tol = 1e-5;tic;
I_denoised = tvdenoise_split_bregman(I_noisy, lambda, mu, max_iter, tol);
processing_time = toc;
fprintf('Processing time: %.2f seconds.\n', processing_time);% 4. Calculate performance metrics
psnr_noisy = psnr(I_noisy, I_clean);
ssim_noisy = ssim(I_noisy, I_clean);
psnr_denoised = psnr(I_denoised, I_clean);
ssim_denoised = ssim(I_denoised, I_clean);% 5. Display results
figure('Position', [100, 100, 1200, 400]);subplot(1, 3, 1);
imshow(I_clean);
title('Original Clean Image');subplot(1, 3, 2);
imshow(I_noisy);
title(sprintf('Noisy Image\nPSNR: %.2f dB, SSIM: %.4f', psnr_noisy, ssim_noisy));subplot(1, 3, 3);
imshow(I_denoised);
title(sprintf('TV-Denoised (Split Bregman)\nPSNR: %.2f dB, SSIM: %.4f', psnr_denoised, ssim_denoised));

参考代码 基于TV模型利用Bregman分裂算法迭代对图像进行滤波和复原处理 www.youwenfan.com/contentcnj/64431.html

第三部分:关键点与扩展

  1. 参数选择

    • lambda:是最关键的参数。对于高斯噪声,λ ~ 1 / (noise_std) 是一个不错的经验法则起点。需要根据噪声水平和期望的平滑度进行调整。
    • mu:通常设置为1.0左右。它对收敛速度有影响,但对最终结果影响较小。mu 越大,约束 d ≈ ∇u 越严格。
    • max_iter & tol:通常100-200次迭代足以收敛。
  2. 优点

    • 边缘保持:相比线性滤波器(高斯模糊)和许多其他方法,TV模型在去噪的同时能卓越地保持边缘。
    • 理论基础强:基于凸优化和变分法。
    • 高效算法:Split Bregman方法使得求解大规模TV问题变得非常快。
  3. 局限性

    • 阶梯效应(Staircasing Effect):在平滑梯度区域可能会产生分段常数近似,看起来像“阶梯”。这是L1范数正则化的固有特性。
    • 纹理保持:可能会平滑掉一些精细的纹理,因为它们也具有高的梯度。
  4. 扩展

    • 彩色图像:通常对每个颜色通道(RGB)独立应用TV去噪,或者在颜色空间(如YUV)中只对亮度分量进行处理。
    • 非盲去卷积:TV模型可以很容易地扩展到图像去模糊问题,将数据保真项改为 ||K*u - f||_2^2,其中 K 是模糊卷积核。
    • 更高阶模型:为了缓解阶梯效应,可以使用高阶TV模型(如Total Generalized Variation, TGV),它同时惩罚一阶和二阶梯度。

这个实现为你提供了一个强大且高效的现代图像复原工具的核心。你可以通过调整参数和将其应用于不同问题(如去模糊、修复)来进一步探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Oracle 中,如果 CLOB 字段存储的是 XML 数据提取特定节点的数据。

在 Oracle 中,如果 CLOB 字段存储的是 XML 数据提取特定节点的数据。Posted on 2025-10-21 09:52 三年三班王小朋 阅读(0) 评论(0) 收藏 举报在 Oracle 中,如果 CLOB 字段存储的是 XML 数据,你可以使用 XMLTyp…

2025.10.20__2023秋季联赛题解(第11题)

题目大意 题意其实很清楚,就是一个模拟对战的游戏。游戏有两个角色 A、B,A 有 hpa 的血量,攻击力为 x;B 有 hpb 的血量,攻击力为 y。 A 每回合有两种操作选择:(1)攻击。对 B 造成 x 点伤害;(2)回血。消耗一…

docker怎么更新版本

docker怎么更新版本

B树和B+树的解析应用

B树和B+树是两种重要的多路平衡搜索树结构,广泛应用于数据库和文件系统领域。下面我们将从C语言实现的角度深入解析它们的原理和实现细节。 一、B树解析 1. 结构定义 #define M 4 // B树的阶数(每个节点最多有M-1个…

最短路分治

trick其实就是快速维护网格图最短路相关的东西,可以带修之类的。Problem: 给出一个 \(n \times m\) 的网格图,格子有权值,要求支持待修改并查询两点间最短路。 \(n \le 2 \times 10^5, m \le 5, q \le 2\times 10^5…

LangChain4j 比 SolonAI 强在哪?弱在哪?

本文对比了Java生态中两大AI框架LangChain4j和Solon AI的差异。功能方面,二者都支持LLM、RAG和MCP接口,但LangChain4j功能更丰富,尤其是RAG适配更全面。使用体验上,Solon AI明显更简洁,如流式对话仅需单行代码,而…

2025 年广州心理疏导机构推荐:桥恩心理多维度服务满足不同人群心理健康需求

随着社会节奏加快,人们面临的心理压力日益增加,心理健康问题逐渐受到广泛关注,心理疏导行业也随之快速发展。在广州这座人口密集、竞争激烈的城市,从青少年的厌学网瘾问题,到成年人的婚姻情感矛盾、职场人际困扰,…

2025 年快速退火炉优质厂家最新推荐榜单:真空 / 半导体 / 晶圆 / 高温 / 桌面等多类型设备企业权威评选

引言 当前,3C、半导体、光伏、汽车等行业迅猛发展,对快速退火炉的需求持续增长,然而市场现状却给企业选购带来诸多困扰。众多厂家中,部分缺乏核心技术,产品性能不稳定,无法满足高精度生产需求;同时,产品质量参…

实用指南:K230基础-显示画面

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年深圳心理疏导机构推荐,桥恩心理:专业心理疏导服务的优质选择与全体系诊疗优势

行业背景 随着社会节奏加快,生活压力、工作挑战、家庭关系等多重因素交织,深圳市民对心理疏导服务的需求日益增长。从青少年的厌学、网瘾问题,到成年人的婚姻情感矛盾、职场人际困扰,再到中老年群体的情绪压力问题…

2025年10月河南园区招商扶持公司推荐:五强对比评测榜

一、引言 对于计划在豫布局的创业者、制造型采购负责人及区域总部拓展团队而言,园区招商扶持公司既是政策落地的“翻译官”,也是要素资源的“整合器”。能否在土地、税收、人才、物流等关键环节拿到真实可兑现的红利…

OIFC NOI2023省队集训

T1 绕口令 twister 字符串题意 给定环形字符串 \(s\),对 \(k\) 从 \(1\) 到 \(n\),判断是否能删去一个长 \(k\) 子段,使得剩余部分无相邻相同字符。考虑已有的相邻相同字符,必须截断。再删去一个子段可能导致剩余部…

KingbaseES 启动失败故障排查

KingbaseES 启动失败故障排查KingbaseES 作为国产数据库的主流产品,在日常运维中难免遇到启动失败的问题。这类故障多与配置参数、系统资源或端口冲突相关,核心排查思路是 “日志定位问题 + 配置 / 系统匹配验证”。…

大数据Spark(六十四):Spark算子介绍 - 详解

大数据Spark(六十四):Spark算子介绍 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

2025年10月手操器公司推荐:对比评测榜揭示工业诊断选型要点

一、引言 在流程工业迈向智能化运维的当下,手操器已不仅是现场调校的辅助工具,更是资产完整性管理的数据入口。对于需要采购、升级或替换手操器的仪表工程师、设备经理以及项目承包商而言,核心诉求集中在三点:一是…

SqlServer 事务复制(transaction replication)的复制位点信息

SqlServer 事务复制(transaction replication)的复制位点信息在逻辑复制中,正如MySQL的show slave status,或者postgresql的逻辑复制pg_stat_replication的sent_lsn,来观察复制进度的坐标位点,其复制进度坐标位置…

2025年10月儿童面霜品牌推荐:五强榜单对比评测与选购指南

一、引言 秋末冬初,气温骤降、湿度骤降,0到12岁儿童角质层厚度仅为成人三分之二,经皮失水速度却高出近三成,皴裂、干痒、苹果脸集中爆发。对于每天要为孩子擦脸、又要控制家庭洗护预算的家长而言,如何在“安全、有…

机器人技术领域多元人才培养计划解析

本文介绍了某机构机器人部门举办的"第一天"奖学金项目,该项目旨在支持多元背景技术人才攻读硕士学位,涵盖机器人技术、人工智能等前沿领域研究,并提供实习机会与专业指导,推动技术创新与行业多样性发展。…

20251018NOIP模拟赛

题目大意: 给你一个长度为 \(2 \times n\) 的由 \(\text{(}\) 和 \(\text{)}\) 构成的串,再给你 \(n\) 个二元组 \(a < b\),保证所有的 \(a\) 与 \(b\) 构成了一个长度为 \(2 \times n\) 的排列。 问能否选出一个…

实战案例:职行力如何利用纷享销客CRM实现人效管理数字化突围?

当数字化服务商自身需要数字化转型,会碰撞出怎样的火花?国内领先的人效运营管理平台职行力,服务建发集团、紫金矿业等世界500强企业,为安踏、七匹狼等头部企业人效提升提供解决方案,却选择与纷享销客携手——仅用…