利用PIL库或其他库读入图像example.jgp,并转化为ndarray格式。利用numpy库的函数,对图像进行矩阵分解。取其TOP-K(K分别为10,50,100)个特征值/奇异值,和对应的特征向量/奇异向量,重建图像。把特征分解、奇异值分解两种方法得到的重建结果进行比较,画出图片
时间: 2024-02-23 21:01:51 浏览: 74
好的,下面给出一个简单的示例代码,供参考:
```python
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 读入图像并转化为ndarray格式
im = Image.open('example.jpg')
im_arr = np.array(im)
# 对图像进行矩阵分解
U, S, Vt = np.linalg.svd(im_arr, full_matrices=False)
# 取TOP-K个特征值/奇异值和对应的特征向量/奇异向量,重建图像
ks = [10, 50, 100]
for k in ks:
# 使用特征分解的方法重建图像
Sk = np.diag(S[:k])
Uk = U[:, :k]
Vtk = Vt[:k, :]
im_svd = np.dot(Uk, np.dot(Sk, Vtk))
# 使用奇异值分解的方法重建图像
Sk = np.diag(S[:k])
Vtk = Vt[:k, :]
im_svd2 = np.dot(np.dot(U, Sk), Vtk)
# 比较特征分解、奇异值分解两种方法得到的重建结果并画出图像
fig, ax = plt.subplots(1, 3, figsize=(10, 4))
ax[0].imshow(im_arr, cmap='gray')
ax[0].set_title('Original image')
ax[1].imshow(im_svd, cmap='gray')
ax[1].set_title('SVD image (k={})'.format(k))
ax[2].imshow(im_svd2, cmap='gray')
ax[2].set_title('SVD2 image (k={})'.format(k))
plt.show()
```
在这个示例代码中,我们读入了一张名为example.jpg的图像,并使用numpy库中的svd函数进行矩阵分解。然后,我们取了10、50和100个特征值/奇异值,和对应的特征向量/奇异向量,分别使用特征分解和奇异值分解的方法重建了图像。最后,我们将原图像、使用特征分解的重建图像和使用奇异值分解的重建图像进行了比较,并画了出来。
需要注意的是,这个示例代码中并没有对重建图像进行PSNR或SSIM等指标的评估,只是简单地进行了可视化比较。如果需要进行更严格的评估,可以使用相应的指标进行计算。
阅读全文