用Python 基于PCA实现1张图片压缩
时间: 2024-05-02 22:19:08 浏览: 417
PCA(Principal Component Analysis)主成分分析是一种经典的数据降维方法,其中的基本思想是通过一些线性变换,将高维数据映射到低维空间中,使得新的特征具有更好的可识别性。
要基于PCA实现图片压缩,需要先将图片转化为矩阵形式,然后利用PCA分析特征向量,提取出主成分(即方差最大的特征向量),并将非主成分特征向量从数据中减去。最后,将特征向量映射回原空间,即可得到降维后的数据,即实现图片压缩。
以下是用Python实现图片压缩的代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
def pca(X, k): # k表示需要保留的主成分个数
# 数据标准化
X_mean = np.mean(X, axis=0)
X_std = np.std(X, axis=0)
X_norm = (X - X_mean) / X_std
# 计算协方差矩阵
cov = np.cov(X_norm.T)
# 计算特征值和特征向量
eigvals, eigvecs = np.linalg.eig(cov)
# 将特征值从大到小排序
idx = np.argsort(-eigvals)
eigvecs = eigvecs[:, idx]
# 选择前k个特征向量
eigvecs = eigvecs[:, :k]
# 将数据映射到主成分空间中
X_reduced = np.dot(X_norm, eigvecs)
# 将数据映射回原空间中
X_reconstructed = np.dot(X_reduced, eigvecs.T) * X_std + X_mean
return X_reduced, X_reconstructed
# 加载图片并转化为numpy数组
img_path = 'test.jpg'
img = Image.open(img_path)
img = np.asarray(img)
# 将图片的三维颜色矩阵展开成二维矩阵
X = img.reshape(img.shape[0]*img.shape[1], img.shape[2])
# 压缩图片
k = 100 # 保留100个主成分
X_reduced, X_reconstructed = pca(X, k)
# 将降维后的数据转化成原图片的形状
img_compressed = X_reconstructed.reshape(img.shape)
# 显示压缩前后的图片
plt.figure()
plt.subplot(121)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(122)
plt.imshow(img_compressed.astype(np.uint8))
plt.title('Compressed Image')
plt.show()
```
这是一个基于PCA实现图片压缩的代码示例,希望对你有帮助!
阅读全文