使用Mini-Batch-K-Means对图像进行压缩

针对一张成都著名景点:锦里的图片,通过 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)
#保存图片





效果展示

 对比图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值