学习了svd,了解到矩阵可以拆分成三个特定矩阵的相乘
其中,D是对角矩阵,U和V均为酉矩阵
取前r个大的特征值,可以获取图像大部分的特征信息,从而对图像进行压缩。
如下图
在python测试了svd,并用一张图像测试了效果,如下图原图
r=5
r=15
r=25
r=35
r=45
python代码如下
from numpy import mat,eye
import numpy as np
from skimage import io,data
img=data.chelsea()
print(img.shape)
img=img/255
io.imshow(img)
io.show()
R,G,B=img[:,:,0],img[:,:,1],img[:,:,2]
UR,SR,VR=np.linalg.svd(R)
UG,SG,VG=np.linalg.svd(G)
UB,SB,VB=np.linalg.svd(B)
def getSVDimage(U,S,V,count):
dig=mat(eye(count)*S[:count]) #获得对角矩阵
redata=U[:,:count]*dig*V[:count,:]
return redata
for k in range(5,80,10):
r1=getSVDimage(UR,SR,VR,k)
g1=getSVDimage(UG,SG,VG,k)
b1=getSVDimage(UB,SB,VB,k)
img_new = np.zeros(img.shape)
img_new[:, :, 0] = r1
img_new[:, :, 1] = g1
img_new[:, :, 2] = b1
io.imshow(img_new)
io.show()
imgimg = np.maximum(img_new,0)
imgsave=np.uint8(imgimg*255)
io.imsave("SVD_cat_k"+str(k)+".bmp",imgsave)