不看廣告,直接看“療效”:
網(wǎng)絡(luò)上下載的圖片,圖片中有大面積色塊的還是有壓縮空間:
保留原圖片中64種顏色。壓縮率:66%,也就是節(jié)省了1/3的存儲(chǔ)空間
對(duì)于網(wǎng)絡(luò)上色彩斑斕的圖片噩斟。壓縮率有可能不降反增。
其實(shí)很多網(wǎng)站的圖片已經(jīng)優(yōu)化壓縮了孤个,能再壓縮的空間很小剃允。
自己拍攝的圖片,即使保留更多的顏色也能獲得較大壓縮比:
壓縮率:33%
原理:
- 保留少數(shù)量的顏色齐鲤,取代原圖片中的N多顏色
- 采用聚類方式得到新的顏色種類斥废,用種類中心的顏色代表這個(gè)顏色種類
- 用選出來(lái)的顏色重新對(duì)圖片著色
代碼在此:
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import imageio
iname = "original.jpg"
cname = "compress_" + iname
#保留的顏色數(shù)量
n_colors = 64
img = imageio.imread(iname)
ax = plt.axes(xticks=[], yticks=[])
ax.imshow(img);
img.shape
data = img / 255.0 # 顏色從0-255轉(zhuǎn)換為0-1之間的小數(shù)
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)
# 計(jì)算壓縮率
import os
from 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
:
KevinZhang
Sep 20, 2018