非负矩阵进行图像压缩的Python代码
时间: 2023-06-14 21:04:49 浏览: 56
以下是使用非负矩阵分解(Non-negative Matrix Factorization, NMF)进行图像压缩的Python代码示例。
首先,我们需要导入必要的库,包括numpy和sklearn:
```python
import numpy as np
from sklearn.decomposition import NMF
from sklearn.datasets import load_sample_image
import matplotlib.pyplot as plt
```
然后,我们需要加载需要压缩的图像。这里,我们使用sklearn自带的示例图像:
```python
# 加载示例图像
china = load_sample_image("china.jpg")
# 将图像数据归一化到0-1之间
china = china / 255.0
```
接下来,我们将图像数据重塑为一个二维数组,其中每一行表示图像的一个像素:
```python
# 将图像数据重塑为一个二维数组
w, h, d = tuple(china.shape)
image_array = np.reshape(china, (w * h, d))
```
现在,我们可以使用NMF进行图像压缩。NMF将图像数据分解为两个非负矩阵W和H,其中W包含原始图像的特征,H包含每个像素点的权重。我们可以通过调整NMF的参数来控制压缩质量。
```python
# 使用NMF进行图像压缩
n_components = 64 # 压缩后的特征数
model = NMF(n_components=n_components, init='nndsvd', random_state=0)
W = model.fit_transform(image_array)
H = model.components_
compressed_image = np.dot(W, H)
```
最后,我们可以将压缩后的图像数据重塑为原始图像的形状,并显示原始图像和压缩后的图像:
```python
# 将压缩后的图像数据重塑为原始图像的形状
compressed_china = np.reshape(compressed_image, (w, h, d))
# 显示原始图像和压缩后的图像
plt.figure()
plt.imshow(china)
plt.title('Original image')
plt.axis('off')
plt.figure()
plt.imshow(compressed_china)
plt.title('Compressed image')
plt.axis('off')
plt.show()
```
这就是使用NMF进行图像压缩的Python代码示例。