发新帖
开启左侧

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

[复制链接]
71 0
摘要: 本文以图像压缩为例,介绍了机器学习的实际应用之一。
在彩色图像中,每个像素的大小为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均值算法后实现的簇中心存储列表的别名。簇标签和代码本都保存在数据类型“无符号整数”中。以下为图像压缩代码:




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




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




此外,您可以通过单独查看码本中的颜色来找到新图像的128种颜色。
注意
1. 如果您尝试按照博客文章中的方式来压缩“jpeg”图像,那么您将会发生错误,因为jpeg会进行有损压缩。 jpeg的压缩算法改变了像素的值,因此包含标签的压缩图像中的像素可能会超过K,从而导致错误。
2. K均值算法是在给定数据集中查找指定数量簇的优化问题。图像尺寸增加或K值增加都会增加执行时间。所以,你可以从较低的K值开始,以便快速获得结果。
3. 在压缩时间和压缩比率之间存在折衷。较高的K值将产生更好的压缩图像质量,但压缩时间也会更长。
结论
您可以在这里查看博客文章中的图像所占用的磁盘空间,如下图所示。原始的png图像是1757 KB(tiger.png),而压缩的虎图像和码本总共只有433 KB。新图像也占用更少的空间:由于只有128种独特的颜色,新的压缩比超过2。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表