import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# 读取图片
img_eg = mpimg.imread(r"F:\test21.jpg")
print(img_eg.shape)

# 奇异值分解
img_temp = img_eg.reshape(526, 640 * 3)
U, Sigma, VT = np.linalg.svd(img_temp)
print(Sigma)
# 奇异值分解:我们先将图片变成【526,640×3】,再做奇异值分解,并且从svd函数中得到的奇异值 sigma sigmasigma 它是从大到小排列的

# 取前60个奇异值
sval_nums = 60
img_restruct1 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct1 = img_restruct1.reshape(526, 640,3)
# 取前部分奇异值重构图片
# 1、如果处理的是一维数组,则得到的是两数组的內积。
# 2、如果是二维数组(矩阵)之间的运算,则得到的是矩阵乘法(mastrix product)。
# 3、np.diag(Sigma[0:sval_nums])对角矩阵

# 取前120个奇异值
sval_nums = 120
img_restruct2 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct2 = img_restruct2.reshape(526, 640,3)


fig, ax = plt.subplots(1,3,figsize = (24,32))

ax[0].imshow(img_eg)
ax[0].set(title = "src")
ax[1].imshow(img_restruct1.astype(np.uint8))
ax[1].set(title = "nums of sigma = 60")
ax[2].imshow(img_restruct2.astype(np.uint8))
ax[2].set(title = "nums of sigma = 120")
plt.show()

结果:

SVD奇异值分解应用之图像压缩_奇异值分解

压缩的有点狠