马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 yinda_peng 于 2024-8-9 11:11 编辑 import numpy as np
from numpy import linalg as LA
from PIL import Image
import pylab as plt
plt.rc('font',size=13)
plt.rc('font',family='SimHei')
a = Image.open("C:/Users/Lenovo/Pictures/Camera Roll/魁拔.jpg") #打开图像
if a.mode != 'L':
a = a.convert("L") #转化为灰度图像
b = np.array(a).astype(float)
[p,d,q] = LA.svd(b)
m,n=b.shape #如果不转换为灰度,这里可能会因为too many values报错
R = LA.matrix_rank(b)
plt.figure(0)
plt.plot(np.arange(1,len(d)+1),d,'k.')
plt.title('图像矩阵的奇异值')
CR = []
for K in range(1,int(R/4),50): #如果较多,自行调整步长大小
plt.figure(K)
plt.subplot(121)
plt.title('原图')
plt.imshow(b,cmap='gray')
I = p[:,:K+1]@(np.diag(d[:K+1]))@(q[:K+1,:])
plt.subplot(122)
plt.title("图像矩阵的秩="+str(K))
plt.imshow(I,cmap='gray')
src=m*n
compress=K*(m+n+1)
radio=(1-compress/src)*100 #计算压缩比率
CR.append(radio)
print("Rank=%d;K=%d个;radio=%5.2f"%(R,K,radio))
plt.figure()
plt.plot(range(1,int(R/4),50),CR,'ob-') #如果上面的步长调整,这里记得跟着改变
plt.title("奇异值个数与压缩比率的关系")
plt.xlabel("奇异值的个数")
plt.ylabel("压缩比率")
plt.show()
|