【图像去噪】基于线性NLM去噪器进行图像恢复的缩放插即用ADMM和插即用FISTA算法附Matlab代码
✅作者简介热爱科研的Matlab仿真开发者擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 往期回顾关注个人主页Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条格物致知,完整Matlab代码获取及仿真咨询内容私信。 内容介绍一、图像去噪与恢复的重要性在图像获取与传输过程中图像常受到各种噪声干扰如高斯噪声、椒盐噪声等这会降低图像质量影响后续的图像分析与处理任务如目标识别、图像分割等。因此图像去噪与恢复旨在去除噪声尽可能还原图像的原始信息对提升图像应用效果至关重要。二、线性 NLM 去噪器原理非局部均值NLM概念非局部均值算法基于图像的自相似性即图像中相似的图像块广泛存在。对于图像中某一像素点其去噪后的估计值并非仅依赖于该像素的邻域而是通过对图像中所有与该像素所在图像块相似的图像块进行加权平均得到。线性 NLM线性 NLM 去噪器是 NLM 算法的一种变体它通过线性运算来实现去噪过程。该去噪器利用图像块之间的相似性度量构建权重矩阵将含噪图像与权重矩阵进行线性组合从而得到去噪后的图像。这种方法在保留图像细节方面表现出色能够有效去除噪声的同时较好地维持图像的纹理和结构信息。三、ADMM 算法基础交替方向乘子法ADMMADMM 是一种用于求解凸优化问题的算法常用于处理具有可分离结构的优化问题。它将复杂的优化问题分解为多个简单的子问题通过交替更新变量和拉格朗日乘子来迭代求解。ADMM 在图像恢复中的应用在图像恢复中将图像去噪问题转化为一个优化问题目标函数通常由数据保真项和正则化项组成。数据保真项用于衡量去噪后图像与含噪图像的接近程度正则化项则借助线性 NLM 去噪器引入图像的先验知识如自相似性以促进图像的恢复。ADMM 通过交替更新图像变量和拉格朗日乘子逐步优化目标函数实现图像的去噪与恢复。四、缩放插即用 ADMM 算法原理缩放概念缩放操作旨在调整 ADMM 算法中的某些参数以加快算法的收敛速度或提高恢复图像的质量。通过对步长参数或惩罚参数进行动态缩放使算法在迭代过程中能够更好地平衡数据保真项和正则化项的作用。插即用思想“插即用” 意味着将线性 NLM 去噪器作为一个黑盒模块嵌入到 ADMM 算法中。在 ADMM 的迭代更新过程中每次更新图像变量时利用线性 NLM 去噪器对当前估计的图像进行去噪处理从而实现基于线性 NLM 去噪器的图像恢复。这种方式无需对去噪器进行复杂的修改或重新推导提高了算法的通用性和灵活性。五、FISTA 算法基础快速迭代收缩阈值算法FISTAFISTA 是一种加速的近端梯度算法用于求解特定形式的凸优化问题。它通过引入一个额外的动量项使得迭代过程能够更快地收敛到最优解尤其适用于目标函数具有可分离结构且包含非光滑项的情况。FISTA 在图像恢复中的应用与 ADMM 类似在图像恢复中FISTA 将图像去噪问题构建为优化问题利用数据保真项和基于线性 NLM 去噪器的正则化项。通过迭代更新图像变量每次迭代时计算目标函数的梯度并结合收缩阈值操作逐步逼近最优的去噪图像。六、插即用 FISTA 算法原理插即用实现同样基于 “插即用” 思想将线性 NLM 去噪器嵌入到 FISTA 算法中。在 FISTA 的迭代更新步骤中当进行收缩阈值操作时利用线性 NLM 去噪器对当前估计的图像进行处理将去噪结果作为下一次迭代的输入。这样FISTA 算法借助线性 NLM 去噪器的图像先验知识实现快速且有效的图像恢复。优势插即用 FISTA 算法结合了 FISTA 的快速收敛特性和线性 NLM 去噪器的良好去噪性能在处理大规模图像或对恢复速度要求较高的场景中具有优势能够在较短时间内获得高质量的去噪图像。⛳️ 运行结果 部分代码e to run ISTA instead of FISTA (default is FISTA)%% Output arguments:% x_curr Output% converged Flag, true of the algorithm converged% iters No. of iterations executed% E Iteration-wise errors, norm(x_{k1} - x_k)% P Iteration-wise PSNRs% obj Iteration-wise objective function values%if(~exist(I,var) || isempty(I))calcPSNR false;elsecalcPSNR true;endif(~exist(tol,var) || isempty(tol))tol -1; % Run for max. no. of iterationsendif(~exist(maxiters,var) || isempty(maxiters))maxiters 30;endif(~exist(objfun,var) || isempty(objfun))calcObj false;elsecalcObj true;endif(~exist(runISTA,var) || isempty(runISTA))runISTA false;enditers 1;x_prev x0;y_curr x0;t_curr 1;E nan(1,maxiters);if(calcPSNR)P nan(1,maxiters);P(1) psnr(x0,I,1);endif(calcObj)obj nan(1,maxiters);endwhile(true)v_curr y_curr - gradf(y_curr)./rho_D;x_curr W(v_curr);if(runISTA)t_next 1;elset_next (1 sqrt(1 4*t_curr*t_curr))/2;endy_next x_curr ((t_curr-1)/t_next)*(x_curr - x_prev);% Calculate PSNR, objective value etc.if(calcObj)obj(iters) objfun(x_curr,v_curr);endif(calcPSNR)P(iters1) psnr(x_curr,I,1);fprintf(Iteration %d,\tPSNR %f\n,iters,P(iters1));enderr euclNorm(x_curr - x_prev);E(iters) err;if(err tol)converged true;E(iters1:end) [];break;endif(itersmaxiters)if(err tol)converged true;elseconverged false;endbreak;end% Transition to next iterationiters iters1;y_curr y_next;x_prev x_curr;t_curr t_next;endE(iters1:end) [];if(calcPSNR)P(iters1:end) [];elseP [];endendfunction n euclNorm(y)% Euclidean norm of vector or matrixn sqrt(sum(y(:).*y(:)));end 参考文献往期回顾扫扫下方二维码 往期回顾可以关注主页点击搜索