Pca实现图像压缩的代码
时间: 2024-05-16 09:18:15 浏览: 84
下面是使用PCA实现图像压缩的Python代码:
```python
import numpy as np
from PIL import Image
def pca(X, k):
# 数据矩阵每一维的平均值
n_samples, n_features = X.shape
mean = np.array([np.mean(X[:, i]) for i in range(n_features)])
# 去平均值化
norm_X = X - mean
# 计算协方差矩阵
scatter_matrix = np.dot(np.transpose(norm_X), norm_X)
# 计算特征值和特征向量
eig_val, eig_vec = np.linalg.eig(scatter_matrix)
# 将特征向量按照对应的特征值从大到小排序
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(n_features)]
eig_pairs.sort(reverse=True)
# 选取前k个最大的特征值对应的特征向量
feature = np.array([ele[1] for ele in eig_pairs[:k]])
# 将数据转换到新的低维空间中
data = np.dot(norm_X, np.transpose(feature))
# 重构数据
data_reconstruct = np.dot(data, feature) + mean
# 返回降维后的数据和重构的数据
return data, data_reconstruct
# 加载图片
img = Image.open('img.jpg')
# 转换为灰度图
gray_img = img.convert('L')
# 将图像转换为numpy矩阵
img_matrix = np.array(gray_img)
# 将矩阵转换为一维向量
img_vec = img_matrix.reshape((img_matrix.shape[0]*img_matrix.shape[1], 1))
# PCA降维
data, data_reconstruct = pca(img_vec, 50)
# 将降维后的数据重构成图像矩阵
img_matrix_reconstruct = data_reconstruct.reshape((img_matrix.shape[0], img_matrix.shape[1]))
# 将矩阵转换为图片对象
compress_img = Image.fromarray(np.uint8(img_matrix_reconstruct))
# 显示压缩后的图片
compress_img.show()
```
在上面的代码中,我们首先使用`PIL`库中的`Image`类加载图片,然后将其转换为灰度图,并将图像矩阵转换为一维向量。接着,我们调用`pca`函数对向量进行降维操作,这里我们只保留了前50个最大的特征值对应的特征向量。最后,我们将降维后的数据重构成图像矩阵,并使用`Image`类将其转换为图片对象并显示出来。
阅读全文