利用SVD分解,保留前20个、30个等奇异值,完成彩色图像(见下图)的压缩。 (1)计算压缩比例。 (2)利用pickle等工具将SVD分解的三个矩阵保存到本地,并二次读取出来,完成图片的复原。
时间: 2024-10-19 10:07:19 浏览: 46
基于奇异值分解(SVD)的图片压缩实践
5星 · 资源好评率100%
SVD(奇异值分解)是一种线性代数技术,用于将复杂的矩阵分解成三个简单的部分:左奇异向量矩阵U、右奇异向量矩阵V和对角矩阵Σ,其中Σ包含了原始数据的主要信息,即奇异值,反映了数据的重要性。
(1)为了压缩彩色图像,我们通常针对每个颜色通道(RGB的三个通道)分别进行SVD。假设原始图像大小为MxN,那么压缩过程是这样的:
- 对每个通道进行SVD,得到对应的U、Σ和V。
- 选择前k个最大的奇异值(这里是20个或30个),并仅保留相应的左奇异向量和右奇异向量,形成压缩后的矩阵。
- 新的矩阵大小约为原矩阵的k/M x k/N,因此压缩比例大约是(1 - k/M * k/N)。
(2)保存SVD分解的三个矩阵,你可以使用Python的pickle模块。首先,将U、Σ和V序列化为字节,然后写入文件:
```python
import pickle
# 假设 svd_obj 包含 U、S 和 V
with open('svd_data.pkl', 'wb') as f:
pickle.dump(svd_obj, f)
```
为了恢复图像,从文件中读取这些矩阵,然后重构压缩的图像:
```python
with open('svd_data.pkl', 'rb') as f:
decomposed = pickle.load(f)
# 例如,如果只用了20个奇异值
compressed_image = np.dot(U[:, :20], np.diag(S[:20])) @ V[:20, :]
```
阅读全文