VQ+Kmean实现图片压缩

VQ & Kmeans

VQ(vector quantization)应用最多的是在信号处理的领域,常用于将模拟信号值转为数字信号(计算机可以处理的形式)。目前vq在深度学习上也有应用,比较典型的是近两年出现的vq-vae模型,其中vq模块实现了将连续的embedding映射到离散的codebook上,获得了更加鲁棒的特征,也有人对转换后的特征的可解释性做了实验,比如用在speech上获得的特征理解成phoneme的feature。这里贴两篇典型的vq应用的paper日后填坑。

vq-vae-2 (image generation)
vq-wav2vec: Self-Supervised Learning of Discrete Speech Representations

Kmeans不做多的解释,机器学习unsupervised方法的典型方法,用于数据压缩,稀疏特征的预处理等。聚类方法与vq结合,聚类得到的 centroids 即为vq中的 codebook。

VQ&Kmeans在图片压缩上的应用

代码

from scipy.cluster.vq import kmeans, vq
from numpy import array, reshape, zeros
from PIL import Image
import numpy as np

vqclst = [2, 5, 10]  # 聚类centroids个数,聚类后的颜色总数

im = Image.open('photos/example.jpg')
data = np.array(im).astype(np.float32)

(width, height, channel) = data.shape
data = reshape(data, (height*width, channel))

for k in vqclst:
    print ('Generating vq-%d...' % k)
    # kmeans to get centroids (codebook)
    (centroids, distor) = kmeans(data, k)   # (k, n), float
    # vq to get code of each pixel
    (code, distor) = vq(data, centroids)    # (n, ), (n, )
    im_vq = centroids[code, :]
    im_vq = im_vq.reshape(width, height, channel).astype(dtype=np.uint8)
    new_img = Image.fromarray(im_vq)
    new_img.save('converted/%d-example.jpg' % k)  # save the picture

还有另一种implementation, 来自sklearn官方demo。

输出结果

VQ+Kmean实现图片压缩_第1张图片

漫谈 Clustering (番外篇): Vector Quantization
Color Quantization using K-Means

你可能感兴趣的:(机器学习,python,机器学习)