DIY图像压缩——机器学习实战之K-means 聚类图像压缩:色彩量化

更多深度文章,请关注:https://yq.aliyun.com/cloud
作者:ML bot2

这篇文章是K均值聚类算法(K-means clustering)的一个简单应用:压缩图像。

在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * 256 * 256。下图为1280 x 720像素的图像,采用PNG格式(一种无损压缩技术),大小为1.71 MB。 我们的目标是使用颜色量化进一步压缩图像,尽管压缩过程会有损失。

K均值聚类

这是一种在给定的数据点集合中找到“K”个簇的优化算法。最初,它随机分配K个簇中心,然后基于一些距离度量(例如,欧几里得距离),使来自簇中心的数据点的距离之和最小化。K均值聚类算法有两个步骤:

a)分配 - 将每个数据点分配给离中心距离最近的簇。

b)更新 - 从指定给新簇的数据点计算新的均值(质心)。

为了描述K均值聚类算法前后的区别,请看下面这个例子(K=3)。

在图像压缩问题中,K均值聚类算法会把类似的颜色分别放在K个簇中——也就是说,每个簇的颜色都变成了一种。因此,我们只需要保留每个像素的标签(表明该像素在哪个簇中),以及每个簇的颜色编码即可完成图像的压缩。

压缩

我们将编写一个简单的python代码来压缩图像,并将压缩图像与代码本(Codebook)一起存储。这里保存的压缩图像只是原始图像的每个像素的簇标签。代码本是在运行K均值算法后实现的簇中心存储列表的别名。簇标签和代码本都保存在数据类型“无符号整数”中。以下为图像压缩代码:

from skimage import io
from sklearn.cluster import KMeans
import numpy as np

image = io.imread('tiger.png')
io.imshow(image)
io.show()

rows = image.shape[0]
cols = image.shape[1]

image = image.reshape(image.shape[0]*image.shape[1],3)
kmeans = KMeans(n_clusters = 128, n_init=10, max_iter=200)
kmeans.fit(image)

clusters = np.asarray(kmeans.cluster_centers_,dtype=np.uint8)
labels = np.asarray(kmeans.labels_,dtype=np.uint8 )
labels = labels.reshape(rows,cols); 

np.save('codebook_tiger.npy',clusters.imsave('compressed_tiger.png',labels

我们可以选择足够大的K来表示图像的颜色。示例中K为128,表明原始图像中的所有颜色组合被量化为128种不同的颜色。这些颜色将会在新图片中呈现(解压缩后),并且应在视觉上类似于原始图像。

解压缩

我们还需要解压缩图像,以便可视化重建的图像。以下为图像解压缩代码:

from skimage import io
import numpy as np

centers = np.load('codebook_tiger.npy_image = io.imread('compressed_tiger.png')

image = np.zeros((c_image.shape[0],c_image.shape[1],3),dtype=np.uint8 )
for i in range(c_image.shape[0]):
    for j in range(c_image.shape[1]):
            image[i,j,:] = centers[c_image[i,j],:]
io.imsave('reconstructed_tiger.png',imageo.imshow(image)
io.show()

下图为解压缩后的图像。虽然新图像失去了大量的像素颜色信息,但没有出现任何主要的差异。

此外,您可以通过单独查看码本中的颜色来找到新图像的128种颜色。

注意

1. 如果您尝试按照博客文章中的方式来压缩“jpeg”图像,那么您将会发生错误,因为jpeg会进行有损压缩。 jpeg的压缩算法改变了像素的值,因此包含标签的压缩图像中的像素可能会超过K,从而导致错误。
2. K均值算法是在给定数据集中查找指定数量簇的优化问题。图像尺寸增加或K值增加都会增加执行时间。所以,你可以从较低的K值开始,以便快速获得结果。
3. 在压缩时间和压缩比率之间存在折衷。较高的K值将产生更好的压缩图像质量,但压缩时间也会更长。

结论

您可以在这里查看博客文章中的图像所占用的磁盘空间,如下图所示。原始的png图像是1757 KB(tiger.png),而压缩的虎图像和码本总共只有433 KB。新图像也占用更少的空间:由于只有128种独特的颜色,新的压缩比超过2。

该压缩方法仅仅减少了图像中的颜色数量,又被称为颜色量化(Colour Quantization)。压缩过程中没有减少图像的大小或像素的取值范围。

完整的Python代码可以在Github中找到,希望你很容易再现本文的例子。如果您喜欢这篇文章,请follow博客以获取文章更新,并请分享这篇文章。请尽管讨论有关该帖子的任何内容,我很乐意收到您的反馈。祝你机器学习愉快!
本文由北邮@爱可可-爱生活老师推荐,阿里云组织翻译。
文章原标题《Image Compression using K-means Clustering : Colour Quantization – Machine Learning in Action》,作者:ML bot2,译者:杨辉,审阅:段志成-海棠,附件为原文的pdf。

文章为简译,更为详细的内容,请查看原文

时间: 2017-04-20

DIY图像压缩——机器学习实战之K-means 聚类图像压缩:色彩量化的相关文章

机器学习算法实践 K均值聚类的实用技巧

Bilal Mahmood:我们最常做的分析之一,便是在数据中提取模式. 比方说,某公司的客户可被划分入哪些细分市场? 我们如何在用户网络中找到特定群体的聚类? 通过机器学习的方式,我们可以得到这些问题的答案. 即使当我们不知道需要查找哪些特定数据段,亦或我们的数据格式是非结构化数据,我们都可以有这么一种技术手段,在算法上,分析出数据中合理的数据模式,合适的数据段和分类结果. 在本文中,我们将会详细介绍一种算法,K-Means Clustering(K均值聚类),包括如何衡量其效果,以及如何确定

机器学习算法与Python实践之(五)k均值聚类(k-means)

       机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了.        机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行分类.这属于supervised learning(监督学习).而聚类指事先

机器学习实战(Machine Learning in Action)笔记--Chapter1:机器学习基础

Part1 分类 监督学习一般使用两种类型的目标变量:标称型(主要用于分类).数值型(主要用于回归). 非均衡分类问题 第1章 机器学习基础 专家系统 训练样本.特征.目标变量(分类问题中为类别) 训练数据和测试数据 知识表示 监督学习:分类.回归 无监督学习 将数据集合分成由类似的对象组成的多个类的过程被称为聚类 将寻找描述数据统计值的过程称之为密度估计 监督学习的用途:k-近邻算法.朴素贝叶斯算法.支持向量机.决策树.线性回归.局部加权线性回归.Ridge回归.Lasso最小回归系数估计 无

为什么我的计算结果是1?(机器学习实战,第3张的熵)

问题描述 为什么我的计算结果是1?(机器学习实战,第3张的熵) 想请教各位大神,我在学<机器学习实战 第三章>时,遇到一个问题,就是课程上得出的答案是0,我得出的答案却是1. 代码链接 解决方案 机器学习实战笔记1(机器学习基础) 解决方案二: 本人创建的机器学习研究QQ群445858879,欢迎爱好机器学习的朋友来此交流学习心得,群里有数据挖掘的高手跟大家切磋 解决方案三: 你看看你的数据集,你的1代表第一个特征是最好的划分.书上是第零个

k均值聚类聚类中心更新问题

问题描述 k均值聚类聚类中心更新问题 k均值聚类,更新聚类中心只能用mean吗?我的聚类标准是皮尔逊系数

《Spark MLlib 机器学习实战》1——读后总结

1 概念 2 安装 3 RDD RDD包含两种基本的类型:Transformation和Action.RDD的执行是延迟执行,只有Action算子才会触发任务的执行. 宽依赖和窄依赖用于切分任务,如果都是窄依赖,那么就可以最大化的利用并行. 常用操作: cache 缓存 cartesian 笛卡尔积 coalesce 重分区 countByValue 分组统计 distinct 去除重复 filter 过滤 flatMap map groupBy 分组 keyBy 增加key reduce 拼接

python实现k均值算法示例(k均值聚类算法)_python

简单实现平面的点K均值分析,使用欧几里得距离,并用pylab展示. 复制代码 代码如下: import pylab as pl #calc Euclid squiredef calc_e_squire(a, b):    return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2 #init the 20 pointa = [2,4,3,6,7,8,2,3,5,6,12,10,15,16,11,10,19,17,16,13]b = [5,6,1,4,2,4,3,1,

Python机器学习实战:信用卡欺诈检测

故事背景:原始数据为个人交易记录,但是考虑数据本身的隐私性,已经对原始数据进行了类似PCA的处理,现在已经把特征数据提取好了,接下来的目的就是如何建立模型使得检测的效果达到最好,这里我们虽然不需要对数据做特征提取的操作,但是面对的挑战还是蛮大的. import pandas as pd    import matplotlib.pyplot as plt    import numpy as np    from sklearn.cross_validation import train_tes

Python3下机器学习实战KNN代码出现AttributeError: ‘dict’ object has no attribute错误

出现错误的代码时: result = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) 错误显示: AttributeError: 'dict' object has no attribute 'iteritems' 之所以会出现上述错误是因为python3中已经没有这个属性,直接改为items即可: result = sorted(classCount.items(), key=operator.i