正交匹配算法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])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章