Python 图像处理基础 || 基于 k 均值聚类的图像压缩

基于 k 均值聚类的图像压缩

文章目录

  • 基于 k 均值聚类的图像压缩
    • 1. 图像聚类示意图
    • 2. 代码实现

1. 图像聚类示意图

Python 图像处理基础 || 基于 k 均值聚类的图像压缩_第1张图片

2. 代码实现

import numpy as np
import matplotlib.pyplot as plt
from skimage import io, img_as_float64
from sklearn.cluster import KMeans

image = img_as_float64(io.imread('images/mandrill.png'))

channel = 3 # 颜色通道
nC = 4 # 类数
Mdata = image[:,:,0].reshape(-1,1) # 将灰度图像进行向量化
# 将其它两通道的图像向量化,并拼接到原有向量中,组成结构化数据
for i in range(channel-1):
    Mdata = np.append(Mdata,image[:,:,i+1].reshape(-1,1),axis=1)
km = KMeans(n_clusters=nC).fit(Mdata) # 对结构化向量组成的数据矩阵进行聚类
centers_ = km.cluster_centers_ # 4个类的类中心,每行为一个类中心,矩阵为4*3
labels_ = km.labels_ # 每个像素点的类标号向量,3个颜色通道对应像素点共用一个类标号

# 计算类标号矩阵,采用 one-hot 的思想
Mlabels = np.zeros((len(labels_),nC))
Mlabels[range(len(labels_)), labels_] = 1
Mdata_result = Mlabels@centers_ # M_{n*c}*C_{c*3},为每个像素点分配类中心向量

# 将结构化矩阵恢复成图像
image_comp_ = np.zeros(image.shape)
for i in range(channel):
    image_comp_[:,:,i] = Mdata_result[:,i].reshape(480,480)
    
print(image_comp_.shape)

plt.figure(figsize=(15,6))
plt.subplot(121)
plt.imshow(image)
plt.axis('off')
plt.tight_layout;
plt.subplot(122)
plt.imshow(image_comp_)
plt.axis('off')
plt.show

Python 图像处理基础 || 基于 k 均值聚类的图像压缩_第2张图片

你可能感兴趣的:(Python,图像处理基础,python,聚类,图像处理)