基于压缩感知和KSVD的图像去噪算法matlab仿真

目录

1.算法仿真效果

2.算法涉及理论知识概要

3.MATLAB核心程序

4.完整算法代码文件


1.算法仿真效果

matlab2022a仿真结果如下:

2.算法涉及理论知识概要

      K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。K-SVD通过构建字典来对数据进行稀疏表示,经常用于图像压缩、编码、分类等应用。Y为要表示的信号,D为超完备矩阵(列数大于行数), X为系数矩阵,X与Y按列对应,表示D中元素按照Xi为系数线性组合为Y,我们的目的是找到让X尽量稀疏的D

OMP算法的步骤如下:

       字典学习的思想应该源来实际生活中的字典的概念。字典是前辈们学习总结的精华,当我们需要学习新的知识的时候,不必与先辈们一样去学习先辈们所有学习过的知识,我们可以参考先辈们给我们总结的字典,通过查阅这些字典,我们可以大致学会到这些知识。

        为了将上述过程用准确的数学语言描述出来,我们需要将“总结字典”、“查阅字典”做出一个更为准确的描述。就从我们的常识出发:

        我们通常会要求的我们的字典尽可能全面,也就是说总结出的字典不能漏下关键的知识点。
查字典的时候,我们想要我们查字典的过程尽可能简洁,迅速,准确。即,查字典要快、准、狠。
查到的结果,要尽可能地还原出原来知识。当然,如果要完全还原出来,那么这个字典和查字典的方法会变得非常复杂,所以我们只需要尽可能地还原出原知识点即可。

3.MATLAB核心程序

function a=OMP2(D,x,sigma)

[n,K]=size(D);
a=[];
residual=x;
err=residual'*residual;
E2=1.15*sigma^2*n;
indx=zeros(1,K);
t=0;
while err > E2 && t < K/2
    t=t+1;
    proj=D'*residual;
    pos=find(abs(proj)==max(abs(proj)));
    pos=pos(1);
    indx(t)=pos;
    a=pinv(D(:,indx(1:t)))*x;
    residual=x-D(:,indx(1:t))*a;
    err=residual'*residual;
end;
indx(indx==0)=[];
temp=zeros(K,1); 
temp(indx)=a;
a=sparse(temp);
return;

function [nextDicMtx, nextSparRepMtx] = K_SVD(dataMtx, curDicMtx, curSparRepMtx)
nextDicMtx(:,1) = curDicMtx(:,1); 
for j = 2:1:size(curDicMtx,2)
	usedIndex = find(curSparRepMtx(j,:));
	if ~isempty(usedIndex)
        tmpSparRepMtx = curSparRepMtx(:,usedIndex);
        tmpSparRepMtx(j,:) = 0;
        errMtx = dataMtx(:,usedIndex)-curDicMtx*tmpSparRepMtx;
        [nextDicAtom,singularVal,nextSparVec] = svds(errMtx,1);
        nextSparRepMtx(j,usedIndex) = singularVal*nextSparVec';
        nextDicMtx(:,j) = nextDicAtom;
    else
        nextDicMtx(:,j) = curDicMtx(:,j); 
    end;
    
end;
A518

4.完整算法代码文件

V

猜你喜欢

转载自blog.csdn.net/hlayumi1234567/article/details/129697944