奇异值分解实验——图像压缩 图像文件为birds.jpg 要求:打开图像文件并显示 利用np.linalg.svd对图像数据进行奇异值分解,打印结果 利用前60个奇异值压缩图像并显示 利用前120个奇异值压缩图像并显示
时间: 2023-08-31 19:27:38 浏览: 122
SVD.rar_SVD_svd 图像压缩_svd图像压缩_基于奇异值分解的图像压缩
### 回答1:
好的,我来为您演示奇异值分解实验——图像压缩。
首先,我们需要安装必要的库:numpy和matplotlib。您可以使用以下命令进行安装:
```
!pip install numpy matplotlib
```
接下来,我们可以使用以下代码来打开和显示图像:
```python
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('birds.jpg')
plt.imshow(img)
plt.axis('off')
plt.show()
```
这将打开并显示“birds.jpg”图像。
接下来,我们可以使用np.linalg.svd函数对图像数据进行奇异值分解,并打印结果:
```python
import numpy as np
U, S, Vt = np.linalg.svd(img, full_matrices=False)
print('U shape:', U.shape)
print('S shape:', S.shape)
print('Vt shape:', Vt.shape)
```
这将打印出U、S和Vt的形状。
现在,我们可以使用前60个奇异值来压缩图像,并显示结果:
```python
k = 60
compressed_img = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
plt.imshow(compressed_img)
plt.axis('off')
plt.show()
```
这将显示60个奇异值压缩的图像。
最后,我们可以使用前120个奇异值来压缩图像,并显示结果:
```python
k = 120
compressed_img = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
plt.imshow(compressed_img)
plt.axis('off')
plt.show()
```
这将显示120个奇异值压缩的图像。
完整代码如下:
```python
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
# 打开和显示图像
img = mpimg.imread('birds.jpg')
plt.imshow(img)
plt.axis('off')
plt.show()
# 对图像数据进行奇异值分解,并打印结果
U, S, Vt = np.linalg.svd(img, full_matrices=False)
print('U shape:', U.shape)
print('S shape:', S.shape)
print('Vt shape:', Vt.shape)
# 使用前60个奇异值压缩图像,并显示结果
k = 60
compressed_img = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
plt.imshow(compressed_img)
plt.axis('off')
plt.show()
# 使用前120个奇异值压缩图像,并显示结果
k = 120
compressed_img = U[:, :k] @ np.diag(S[:k]) @ Vt[:k, :]
plt.imshow(compressed_img)
plt.axis('off')
plt.show()
```
### 回答2:
奇异值分解(Singular Value Decomposition,SVD)是一种常用的矩阵分解方法,可以应用于图像压缩。下面是奇异值分解在实验中的具体步骤:
1. 导入必要的库和图像文件:
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 读取图像文件
image = Image.open('birds.jpg')
2. 显示原始图像:
# 显示原始图像
plt.figure(figsize=(6, 6))
plt.imshow(image)
plt.title('Original Image')
plt.axis('off')
plt.show()
3. 奇异值分解并打印结果:
# 将图像转换为灰度图像
image_gray = image.convert('L')
image_data = np.array(image_gray)
# 进行奇异值分解
U, S, V = np.linalg.svd(image_data)
# 打印奇异值分解结果
print('Singular Values Shape:', S.shape)
print('U matrix Shape:', U.shape)
print('V matrix Shape:', V.shape)
4. 利用前60个奇异值压缩图像并显示:
# 重新构建图像(仅使用前60个奇异值)
compressed_image_60 = np.dot(U[:, :60], np.dot(np.diag(S[:60]), V[:60, :]))
compressed_image_60 = np.clip(compressed_image_60, 0, 255).astype('uint8')
# 显示压缩后的图像
plt.figure(figsize=(6, 6))
plt.imshow(compressed_image_60, cmap='gray')
plt.title('Compressed Image (60 Singular Values)')
plt.axis('off')
plt.show()
5. 利用前120个奇异值压缩图像并显示:
# 重新构建图像(仅使用前120个奇异值)
compressed_image_120 = np.dot(U[:, :120], np.dot(np.diag(S[:120]), V[:120, :]))
compressed_image_120 = np.clip(compressed_image_120, 0, 255).astype('uint8')
# 显示压缩后的图像
plt.figure(figsize=(6, 6))
plt.imshow(compressed_image_120, cmap='gray')
plt.title('Compressed Image (120 Singular Values)')
plt.axis('off')
plt.show()
以上就是利用奇异值分解进行图像压缩的实验步骤,并显示了使用前60个和前120个奇异值进行压缩后的图像。
### 回答3:
奇异值分解(Singular Value Decomposition,SVD)是一种矩阵分解方法,可以将一个矩阵分解成三个矩阵的乘积。在图像处理中,奇异值分解可以用于图像压缩。
首先,我们需要导入所需的库和图像文件。然后,可以使用matplotlib库中的imshow函数来显示图像。
```python
import numpy as np
import matplotlib.pyplot as plt
# 打开图像文件并显示
image = plt.imread('birds.jpg')
plt.imshow(image)
plt.show()
```
接下来,利用np.linalg.svd对图像数据进行奇异值分解,并打印结果。
```python
# 对图像数据进行奇异值分解
U, s, V = np.linalg.svd(image, full_matrices=False)
# 打印结果
print("U shape:", U.shape)
print("s shape:", s.shape)
print("V shape:", V.shape)
```
可以看到结果中三个矩阵的形状信息。U矩阵表示原图像数据在奇异值分解空间的投影,s是奇异值的向量,V矩阵为奇异向量。
接下来,我们可以利用前60个奇异值来压缩图像,并显示结果。
```python
# 压缩图像(前60个奇异值)
compressed_image_60 = U[:, :60] @ np.diag(s[:60]) @ V[:60, :]
plt.imshow(compressed_image_60)
plt.show()
```
同样地,我们也可以利用前120个奇异值来压缩图像并显示结果。
```python
# 压缩图像(前120个奇异值)
compressed_image_120 = U[:, :120] @ np.diag(s[:120]) @ V[:120, :]
plt.imshow(compressed_image_120)
plt.show()
```
以上就是利用奇异值分解进行图像压缩的实验过程,通过选择不同数量的奇异值,可以控制图像的压缩程度和质量。
阅读全文