正交匹配算法OMP

在这里插入图片描述
在这里插入图片描述
MP.pdf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
OMP.pdf
在这里插入图片描述
在这里插入图片描述
malab

import  numpy as np
import math
from PIL import Image
import matplotlib.pyplot as plt
from sklearn import preprocessing
im = Image.open('C:/Users/lenovo/opencv/opencv-tutorial-master/images/Lenna.png').convert('L')
plt.imshow(im,cmap='gray')
im=im.resize((256,256))
im=np.array(im)
#生成高斯随机测量矩阵
sampleRate=0.5  #采样率
Phi=np.random.randn(int(256*sampleRate),256)
#生成稀疏基DCT矩阵
mat_dct_1d=np.zeros((256,256))
v=range(256)
for k in range(0,256):
    dct_1d=np.cos(np.dot(v,k*math.pi/256))
    if k>0:
        dct_1d=dct_1d-np.mean(dct_1d)
    mat_dct_1d[:,k]=dct_1d/np.linalg.norm(dct_1d)
plt.imshow(mat_dct_1d,cmap='gray')
#随机测量
img_cs_1d=np.dot(Phi,im)
#OMP算法函数
def cs_omp(y,D,L):#传入参数为y和传感矩阵
    #L=math.floor(y.shape[0]/4)
    D1=preprocessing.normalize(D, norm='l2')#L2正则化,模长为1
    residual=y  #初始化残差
    index=np.zeros((L),dtype=int)
    for i in range(L):
        index[i]= -1
    result=np.zeros((256))
    
    for j in range(L):  #迭代次数
        product=np.fabs(np.dot(D1.T,residual))
        pos=np.argmax(product)  #最大投影系数对应的位置
        index[j]=pos
        tmp=[]
        tmp2=[]
        for tt in range(len(index)):
            if (index[tt]>0)or(index[tt]==0):
                tmp.append(tt)
            
        tmp1=D[:,tmp]
        my = np.linalg.pinv(D[:,tmp])  # 最小二乘
        a=np.dot(my,y) #最小二乘
        residual=y-np.dot(D[:,tmp],a)
    result[tmp]=a
    return  result
#重建
sparse_rec_1d=np.zeros((256,256))   # 初始化稀疏系数矩阵
Theta_1d=np.dot(Phi,mat_dct_1d)   #测量矩阵乘上基矩阵
for i in range(256):
    #print('正在重建第',i,'列。')
    column_rec=cs_omp(img_cs_1d[:,i],Theta_1d,32) #利用OMP算法计算稀疏系数
    sparse_rec_1d[:,i]=column_rec;
img_rec=np.dot(mat_dct_1d,sparse_rec_1d)          #稀疏系数乘上基矩阵

#显示重建后的图片
image2=Image.fromarray(img_rec)
plt.imshow(image2,cmap='gray')
#b不用DCT表示重建
sparse_rec_1d=np.zeros((256,256))   # 初始化稀疏系数矩阵
#heta_1d=np.dot(Phi,mat_dct_1d)   #测量矩阵乘上基矩阵
for i in range(256):
    #print('正在重建第',i,'列。')
    column_rec=cs_omp(img_cs_1d[:,i],Phi,32) #利用OMP算法计算稀疏系数
    sparse_rec_1d[:,i]=column_rec;
#img_rec=np.dot(mat_dct_1d,sparse_rec_1d)          #稀疏系数乘上基矩阵
#显示重建后的图片
image3=Image.fromarray(sparse_rec_1d)
plt.imshow(image3,cmap='gray')
np.dot(mat_dct_1d[:,1],mat_dct_1d[:,2]) 
np.dot(Phi[:,1],Phi[:,2]) /np.linalg.norm(Phi[:,1])/np.linalg.norm(Phi[:,2])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章