针对一张成都著名景点:锦里的图片,通过 Mini Batch K-Means 的方法将相近的像素点聚合后用同一像素点代替,以达到图像压缩的效果。
直接看代码
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 27 09:31:20 2018
图像压缩---
MiNi-Batch-K-Means方法
原理:相近像素点进行聚类并用同一像素点进行代替,达到压缩的目的
数据:http://labfile.oss.aliyuncs.com/courses/1081/challenge-7-chengdu.png
"""
#使用matplotlib可视化照片
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
chengdu=mpimg.imread('challenge-7-chengdu.png')
plt.imshow(chengdu)
print(chengdu.shape)#返回一个像素点矩阵,共422604个像素
"""返回的是一个 numpy.array 类型的数组,(516, 819, 3),
该数组表示的是一个像素点的矩阵,包含长,宽,高三个要素。
如成都锦里这张图片,总共包含了516行,819列共516∗819=422604
个像素点,每一个像素点的高度对应着计算机颜色中的三原色R,G,B
(红,绿,蓝),共 3 个要素构成"""
#数据预处理
data=chengdu.reshape(422604,3)#数据格式变换,降维
#计算像素点种类个数,R,G,B三个值都相同的点为一个种类
def get_variety(data):
temp=data.tolist()
num_variety=len(set(tuple(t) for t in temp))
return num_variety
#使用minibatch进行聚类
#聚类簇数量设置为 10 类,使用 cluster_centers_()函数进行替换
from sklearn.cluster import MiniBatchKMeans
model=MiniBatchKMeans(10)
model.fit(data)
predict=model.predict(data)
new_colors=model.cluster_centers_[predict]
#用每一个中心的像素点代替属于该类别的像素点。
print(get_variety(new_colors))#10个像素
#绘图对比
fig,ax=plt.subplots(1,2,figsize=(10,6))
new_chengdu=new_colors.reshape(chengdu.shape)
ax[0].imshow(chengdu)
ax[1].imshow(new_chengdu)
mpimg.imsave('new_cehngdu.png',new_chengdu)
#保存图片
效果展示
对比图