利用前面编写的函数,分别对图像进行压缩并比较。具体要求如下:利用PIL库或其他库读入图像example.jgp,并转化为ndarray格式。利用numpy库的函数,对图像进行矩阵分解。取其TOP-K(K分别为10,50,100)个特征值/奇异值,和对应的特征向量/奇异向量,重建图像。把特征分解、奇异值分解两种方法得到的重建结果进行比较,画出图片。
时间: 2024-02-23 15:01:35 浏览: 71
以下是代码实现,假设example.jpg在当前路径下:
```python
import numpy as np
from PIL import Image
def svd_compress(image_path, K):
# 读入图像并转化为ndarray格式
im = Image.open(image_path)
arr = np.array(im)
# 进行矩阵分解
U, s, Vt = np.linalg.svd(arr, full_matrices=False)
# 取TOP-K个特征值/奇异值和对应的特征向量/奇异向量
Uk = U[:, :K]
sk = np.diag(s[:K])
Vtk = Vt[:K, :]
# 用特征向量/奇异向量重建图像
arr_reconstructed = np.dot(np.dot(Uk, sk), Vtk)
im_reconstructed = Image.fromarray(arr_reconstructed.astype('uint8'))
return im_reconstructed
# 设置K值
K_values = [10, 50, 100]
# 对每个K值压缩图像并比较
for K in K_values:
# 特征分解压缩
im_reconstructed_feat = svd_compress('example.jpg', K)
# 奇异值分解压缩
arr = np.array(Image.open('example.jpg'))
U, s, Vt = np.linalg.svd(arr, full_matrices=False)
sk = np.diag(s)
sk[K:] = 0
arr_reconstructed_svd = np.dot(np.dot(U, sk), Vt)
im_reconstructed_svd = Image.fromarray(arr_reconstructed_svd.astype('uint8'))
# 显示原图、特征分解压缩图像和奇异值分解压缩图像
fig, axs = plt.subplots(nrows=1, ncols=3)
axs[0].imshow(Image.open('example.jpg'))
axs[0].set_title('Original Image')
axs[1].imshow(im_reconstructed_feat)
axs[1].set_title(f'Feature Compression (K={K})')
axs[2].imshow(im_reconstructed_svd)
axs[2].set_title(f'SVD Compression (K={K})')
plt.show()
```
这段代码将原图、特征分解压缩图像和奇异值分解压缩图像显示在一起,方便比较。
阅读全文