利用PIL库或其他库读入图像example.jgp,并转化为ndarray格式。 利用numpy的函数,对图像进行矩阵分解。 (取其TOP-K(K分别为10,50,100)个特征值/奇异值,和对应的特征向量/奇异向量,重建图像。把特征分解、奇异值分解两种方法得到的重建结果进行比较,画出图片。
时间: 2024-02-23 09:01:25 浏览: 76
使用numpy和PIL进行简单的图像处理方法
以下是代码实现,假设example.jpg在当前路径下:
```python
import numpy as np
from PIL import Image
# 读入图像并转化为ndarray格式
im = Image.open('example.jpg')
arr = np.array(im)
# 进行矩阵分解
U, s, Vt = np.linalg.svd(arr, full_matrices=False)
# 设置K值
K_values = [10, 50, 100]
# 对每个K值重建图像
for K in K_values:
# 取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'))
im_reconstructed.save(f'reconstructed_K_{K}.jpg')
```
重建结果的比较可以通过以下代码实现:
```python
import matplotlib.pyplot as plt
# 显示原图和重建图像
fig, axs = plt.subplots(nrows=2, ncols=2)
axs[0, 0].imshow(arr)
axs[0, 0].set_title('Original Image')
for i, K in enumerate(K_values):
arr_reconstructed = np.dot(np.dot(U[:, :K], np.diag(s[:K])), Vt[:K, :])
axs[i//2, i%2+1].imshow(arr_reconstructed.astype('uint8'))
axs[i//2, i%2+1].set_title(f'Reconstructed Image (K={K})')
plt.show()
```
这段代码将原图和每个K值对应的重建图像显示在一起,方便比较。
阅读全文