继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

k-means算法另类应用:压缩图片

青春有我
关注TA
已关注
手记 1239
粉丝 205
获赞 1008

webp

不看广告,直接看“疗效”:

网络上下载的图片,图片中有大面积色块的还是有压缩空间:


webp

保留原图片中64种颜色。压缩率:66%,也就是节省了1/3的存储空间

对于网络上色彩斑斓的图片。压缩率有可能不降反增。


webp


其实很多网站的图片已经优化压缩了,能再压缩的空间很小。

自己拍摄的图片,即使保留更多的颜色也能获得较大压缩比:


webp

压缩率:33%

原理:

  • 保留少数量的颜色,取代原图片中的N多颜色

  • 采用聚类方式得到新的颜色种类,用种类中心的颜色代表这个颜色种类

  • 用选出来的颜色重新对图片着色

代码在此:

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsimport imageio

iname = "original.jpg"cname = "compress_" + iname#保留的颜色数量n_colors = 64img = imageio.imread(iname)


ax = plt.axes(xticks=[], yticks=[])
ax.imshow(img);


img.shape


data = img / 255.0 # 颜色从0-255转换为0-1之间的小数data = data.reshape(-1, 3)
data.shape#批量KMeansfrom sklearn.cluster import MiniBatchKMeans
kmeans = MiniBatchKMeans(n_colors)
kmeans.fit(data)
new_colors = kmeans.cluster_centers_[kmeans.predict(data)]#重新着色new_img = new_colors.reshape(img.shape)
new_img = (255 * new_img).astype(np.uint8)

fig, ax = plt.subplots(1, 2, figsize=(16, 6),
                       subplot_kw=dict(xticks=[], yticks=[]))
fig.subplots_adjust(wspace=0.05)
ax[0].imshow(img)
ax[0].set_title('Original Image', size=16)
ax[1].imshow(new_img)
ax[1].set_title(str(n_colors)+'-color Image', size=16);#保存压缩后的图片imageio.imsave(cname,new_img)# 计算压缩率import osfrom os.path import join, getsize

compress_ratio = getsize(cname) / getsize(iname)
compress_ratio

代码参考:
https://mybinder.org/v2/gh/jakevdp/PythonDataScienceHandbook/master?filepath=notebooks%2FIndex.ipynb

里面的In Depth: k-Means Clustering

webp


KevinZhang
Sep 20, 2018



作者:_KevinZhang_
链接:https://www.jianshu.com/p/6d36c271c271


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP