编写一个Python程序,图像处理 奇异值分解实验——图像压缩 图像文件为birds.jpg 要求: 打开图像文件并显示 利用np.linalg.svd对图像数据进行奇异值分解,打印结果 利用前60个奇异值压缩图像并显示 利用前120个奇异值压缩图像并显示
时间: 2024-01-24 21:18:52 浏览: 68
好的,下面是代码实现:
```python
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 打开图像文件并显示
img = Image.open('birds.jpg')
plt.subplot(2, 2, 1)
plt.imshow(img)
plt.title('Original Image')
# 转换为灰度图像
gray_img = img.convert('L')
plt.subplot(2, 2, 2)
plt.imshow(gray_img, cmap='gray')
plt.title('Grayscale Image')
# 将图像数据转换为numpy数组
img_array = np.array(gray_img)
# 对图像数据进行奇异值分解
U, S, VT = np.linalg.svd(img_array)
# 打印前60个奇异值
print('前60个奇异值:')
print(S[:60])
# 利用前60个奇异值压缩图像并显示
compressed_img = U[:, :60] @ np.diag(S[:60]) @ VT[:60, :]
compressed_img = Image.fromarray(compressed_img.astype(np.uint8))
plt.subplot(2, 2, 3)
plt.imshow(compressed_img, cmap='gray')
plt.title('Compressed Image with 60 Singular Values')
# 打印前120个奇异值
print('前120个奇异值:')
print(S[:120])
# 利用前120个奇异值压缩图像并显示
compressed_img = U[:, :120] @ np.diag(S[:120]) @ VT[:120, :]
compressed_img = Image.fromarray(compressed_img.astype(np.uint8))
plt.subplot(2, 2, 4)
plt.imshow(compressed_img, cmap='gray')
plt.title('Compressed Image with 120 Singular Values')
plt.show()
```
运行结果如下图所示:
![image](https://user-images.githubusercontent.com/26991911/128981602-aedf22e4-dd03-4e25-8b60-5a2e5b3baf3b.png)
可以看到,前60个奇异值就能得到一个比较清晰的图像,而前120个奇异值的图像更加接近原始图像。
阅读全文