下面我将详细讲解“在Python中使用K-Means聚类和PCA主成分分析进行图像压缩”的完整攻略。
一、背景知识
在学习本攻略前,需要掌握以下知识:
- Python编程基础
- NumPy库基础
- matplotlib库基础
- K-Means聚类算法
- PCA主成分分析算法
二、图像压缩原理
对于一张彩色图片,它通常由三个颜色通道(R、G、B)组成。假设每个通道都是8位(即256级),那么一张图片就需要$256^3=16777216$种不同的颜色。这意味着一张分辨率为512$\times$512,每个像素点颜色有三个通道的彩色图片需要$512\times512\times3=786,432$个数字来表示。这对于传输和存储都是非常消耗资源的。
因此,我们可以采用图像压缩来减小图片的体积。而K-Means聚类算法和PCA主成分分析算法都能够对图片进行压缩。
三、使用K-Means进行图像压缩
1. 加载图片
我们可以使用matplotlib库的imread()函数来加载一张图片。例如,加载一张名为“test.jpg”的图片:
import matplotlib.pyplot as plt
import numpy as np
img = plt.imread('test.jpg')
2. 调整图片
由于K-Means算法需要将图片转换为向量,所以我们需要将图片变成$nx3$的NumPy矩阵,其中n是像素点的数量。同时,我们还需要将像素点的值标准化,以便K-Means算法能够更好地工作。
# 调整图片大小
img_size = img.shape
X = img.reshape(img_size[0] * img_size[1], img_size[2])
# 标准化像素点
X = X / 255.0
3. 运行K-Means算法
接下来,我们使用scikit-learn库的KMeans()函数运行K-Means聚类算法。这里使用K=16进行聚类。
from sklearn.cluster import KMeans
K = 16
kmeans = KMeans(K)
kmeans.fit(X)
4. 压缩图片
将像素点转换为最接近的聚类中心:
X_compressed = kmeans.predict(X)
将每个像素点转换为所属的聚类中心的颜色:
X_recovered = kmeans.cluster_centers_[X_compressed]
其实,这个过程就是将K-Means聚类算法的输出作为像素点的颜色值,重构出压缩后的图片。
5. 显示图片
我们可以使用Matplotlib库中的imshow和show函数来显示原始图片和压缩后的图片。
# 显示原始图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')
# 显示压缩后的图片
plt.subplot(1, 2, 2)
X_recovered_3D = X_recovered.reshape(img_size[0], img_size[1], img_size[2])
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=' + str(K))
plt.show()
6. 完整示例说明
下面是一个完整的例子,使用K-Means来对一张图片进行压缩:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
# 加载图片
img = plt.imread('test.jpg')
# 调整图片大小
img_size = img.shape
X = img.reshape(img_size[0] * img_size[1], img_size[2])
# 标准化像素点
X = X / 255.0
# 运行K-Means算法
K = 16
kmeans = KMeans(K)
kmeans.fit(X)
# 压缩图片
X_compressed = kmeans.predict(X)
X_recovered = kmeans.cluster_centers_[X_compressed]
# 显示图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(1, 2, 2)
X_recovered_3D = X_recovered.reshape(img_size[0], img_size[1], img_size[2])
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=' + str(K))
plt.show()
四、使用PCA进行图像压缩
1. 加载图片
同样,我们可以使用matplotlib库的imread()函数来加载一张图片。
import matplotlib.pyplot as plt
import numpy as np
img = plt.imread('test.jpg')
2. 转换图像
我们使用reshape()函数将图像转换为一条向量。同时,我们也需要将像素点的值标准化。
X = np.array(img, dtype=float) / 255
X = X.reshape(-1, 3)
3. 运行PCA算法
使用scikit-learn库的PCA类来运行PCA算法。这里我们将数据降到k=16维。
from sklearn.decomposition import PCA
pca = PCA(n_components=16)
pca.fit(X)
4. 压缩图像
我们使用PCA算法输出的主成分来生成压缩后的图片。
X_reduced = pca.transform(X)
X_recovered = pca.inverse_transform(X_reduced)
5. 显示图片
同样,我们使用Matplotlib库中的imshow和show函数来显示原始图片和压缩后的图片。
# 显示原始图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')
# 显示压缩后的图片
plt.subplot(1, 2, 2)
X_recovered_3D = np.clip(X_recovered.reshape(img.shape), 0, 1)
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=16')
plt.show()
6. 完整示例说明
下面是一个完整的例子,使用PCA来对一张图片进行压缩:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.decomposition import PCA
# 加载图片
img = plt.imread('test.jpg')
# 调整图片大小
X = np.array(img, dtype=float) / 255
X = X.reshape(-1, 3)
# 运行PCA算法
pca = PCA(n_components=16)
pca.fit(X)
# 压缩图片
X_reduced = pca.transform(X)
X_recovered = pca.inverse_transform(X_reduced)
# 显示图片
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(1, 2, 2)
X_recovered_3D = np.clip(X_recovered.reshape(img.shape), 0, 1)
plt.imshow(X_recovered_3D)
plt.title('Compressed Image, K=16')
plt.show()
以上就是使用K-Means聚类和PCA主成分分析进行图像压缩的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Python中使用K-Means聚类和PCA主成分分析进行图像压缩 - Python技术站