奇异值收缩算法(SVT)的理解(核范数优化)

本文探讨了奇异值收缩方法在矩阵完成问题中的应用,通过减去大于的奇异值并结合拉格朗日参数的梯度递增算法,确保了矩阵的低秩性和稀疏二范数。该方法有效用于从部分已知数据恢复完整矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题的解是,这就是奇异值收缩方法,也就是大于的奇异值减去,然后再乘回去得到问题的解,具体证明参考A Singular Value Thresholding Algorithm for Matrix Completion第5页。具体解释见下图:

问题的解是,Y0=0,第一步就是奇异值收缩,第二部是拉格朗日参数的梯度递增算法,具体证明看A Singular Value Thresholding Algorithm for Matrix Completion的攻势2.13。可以保证X的低rank,并稀疏二范数。

问题的解是

是矩阵离散,已知的部分,用来恢复整个矩阵。

clear,clc close all %% 梳理思路 % 输入 I_parallel or I_vertical % 稀疏低秩处理得到过滤掉一部分B的I∥pro or I⊥pro;并通过P的关联得到I⊥or∥pro % 把I∥pro和I⊥pro作为输入的原始的I平行和I垂直 % 找到全局的最亮最暗点 % 计算L % 直方图拉伸并输出L_XY %% %% YY cd('D:\吕伟婷--偏振成像\code\LRSR+HSI+DOP+5.2\image_zhaolin\浓度11\1\'); files = dir('*.tif'); m = size(files,1); I = 0; for i =1:m I0(:,:,i) = double((imread(files(i).name))); % 读取I1 I = I+I0(:,:,i); end Imax = I/m; cd('D:\吕伟婷--偏振成像\code\LRSR+HSI+DOP+5.2\image_zhaolin\浓度11\2\'); files = dir('*.tif'); m = size(files,1); I = 0; for i = 1:m I0(:,:,i) = double((imread(files(i).name))); % 读取I1 I = I+I0(:,:,i); end Imin = I/m; Imaxs = double(Imax); Imins = double(Imin); %% 可作为原始光强进行对比,但是要注意修改比例 qq = 2^8; % 已查看图像是8位的 I_parallel = Imaxs/qq; I_vertical = Imins/qq; figure; subplot(2,2,1); imshow(I_parallel);title('平行图像'); subplot(2,2,2); imhist(I_parallel); % 显示灰度直方图 xlabel('灰度值'); ylabel('像素数量'); subplot(2,2,3); imshow(I_vertical);title('垂直图像'); subplot(2,2,4); imhist(I_vertical); % 显示灰度直方图 xlabel('灰度值'); ylabel('像素数量'); %% 计算P用来关联 P = (I_parallel-I_vertical)/(I_parallel+I_vertical+eps); %% 稀疏低秩 %% 稀疏低秩 [m, n] = size(I_vertical);%获得处理图像的尺寸 % 参数 lambda = 0.3 / sqrt(max(m, n)); %正则化参数 mu = 1 / norm(I_vertical, 'fro'); %初始惩罚参数 rho = 1.1; %惩罚参数更新因子 maxiter = 300; %最大迭代次数 tol = 1e-7;%收敛容差 B_vertical = zeros(m,n); % 低秩背景(空气光)分量 %空还是0 D_vertical = zeros(m,n); % 稀疏目标分量 Y = zeros(m,n); % ADMM主循环 for iter = 1:maxiter % 保存前次结果 D_prev = D_vertical; B_prev = B_vertical; % 稳健SVD--求B [U, Sigma, V] = svd(I_vertical - D_vertical + Y/mu, 'econ'); sigma_vals = diag(Sigma); % 自适应阈值(避免过度截断) energy_ratio = cumsum(sigma_vals)./sum(sigma_vals); rank_est = find(energy_ratio > 0.98, 1); if isempty(rank_est) rank_est = length(sigma_vals); end % 平滑阈值函数(减少截断伪影) thresh = max(sigma_vals(1)*0.05, 1/mu); sigma_thresh = max(sigma_vals - thresh, 0); % ===== 关键改进2:稳健稀疏更新 ===== temp = I_vertical - B_vertical + Y/mu; % 使用Huber损失代替L1范数(减少条带伪影) delta = 0.01; abs_temp = abs(temp); D_vertical = temp .* max(1 - delta./(abs_temp + eps), 0); % 更新乘子 Y = Y + mu * (I_vertical - D_vertical - B_vertical); % 收敛检查 rel_err = norm(I_vertical- D_vertical - B_vertical, 'fro') / norm(I_vertical, 'fro'); if rel_err < tol && iter > 20 break; end % 更新惩罚参数 mu = min(mu * rho, 1e7); end airlight = B_vertical; % 空气光分量(低秩) targetlight = D_vertical; % 目标光分量(稀疏) % ====== 显示结果 ====== figure; subplot(221); imshow(I_vertical); title('原始垂直偏振图像'); subplot(222); imshow(airlight); title('分离的空气光'); subplot(223); imshow(targetlight); title('分离的目标光'); subplot(224); imshow(imadjust(targetlight)); title('增强的目标光'); 我目前正在使用matlab处理水下很暗的环境下的有雾的图像,物理模型是以色列人的传统的偏振模型。预使用稀疏低秩的方法将空气光和目标光,在不拉伸图像的基础上,给我修改稀疏低秩部分的代码
最新发布
08-04
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值