k-means算法另类应用(压缩图片)
文章图片
不看广告,直接看“疗效”:
网络上下载的图片,图片中有大面积色块的还是有压缩空间:
保留原图片中64种颜色。压缩率:66%,也就是节省了1/3的存储空间
对于网络上色彩斑斓的图片。压缩率有可能不降反增。
其实很多网站的图片已经优化压缩了,能再压缩的空间很小。
自己拍摄的图片,即使保留更多的颜色也能获得较大压缩比:
压缩率:33%
原理:
- 保留少数量的颜色,取代原图片中的N多颜色
- 采用聚类方式得到新的颜色种类,用种类中心的颜色代表这个颜色种类
- 用选出来的颜色重新对图片着色
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import imageioiname = "original.jpg"
cname = "compress_" + iname#保留的颜色数量
n_colors = 64
img = imageio.imread(iname)ax = plt.axes(xticks=[], yticks=[])
ax.imshow(img);
img.shapedata = https://www.it610.com/article/img / 255.0 # 颜色从0-255转换为0-1之间的小数
data = data.reshape(-1, 3)
data.shape#批量KMeans
from 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 os
from os.path import join, getsizecompress_ratio = getsize(cname) / getsize(iname)
compress_ratio
代码参考:
https://mybinder.org/v2/gh/jakevdp/PythonDataScienceHandbook/master?filepath=notebooks%2FIndex.ipynb
里面的
In Depth: k-Means Clustering
:文章图片
【k-means算法另类应用(压缩图片)】KevinZhang
Sep 20, 2018
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- 《算法》-图[有向图]
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 虚拟DOM-Diff算法详解
- 《数据结构与算法之美》——队列
- 算法回顾(SVD在协同过滤推荐系统中的应用)
- 简谈迪克斯特拉算法