KMeans算法可以应用于图像压缩,这种压缩实质上是一种有损压缩,实质上是将原本的色彩空间进行聚类,当所聚类的数据增长时,压缩后的质量也随之增加。
关于聚类算法的的介绍和具体处理步聚就是在这里细讲,主要是讲解关于 KMeans 应用于图像压缩的实质和实现
从下图可以看到对一张原图使用 KMeans 使用聚类算法进行压缩时,首先要将原来的图像的所有像素放置到一个相同维度的容器,例如Numpy
中的Array
,然后进行进聚类,最终聚类的个数需要指定,聚类个数越大,压缩后的图像质量也就越好,但压缩比就降低,即压缩后的文件大小变化并不明显。注意在保存的压缩文件,压缩的图像坐标[x,y]所对应的并不是这个像素的 RGB 值,而是一个类似于指针的 Index。如下所的例子,原图所有像素聚类后的中心点有64个,那么可以用6bit 来表示(\(2^6=64\)),从例方向看每一列就对应一个聚类后的 RGB 颜色,压缩后的图像,图上的 K 就指向其中一列,表示取这个颜色,在恢复原图时就依据这个,把指向的具体的 RGB 值取出来。
因此,压缩只是存储的压缩,在内存中进行显示的时候,还是需要还原,占用的内存空间和原图所占用的内存空间是一样大的。

下图是一张不同聚类个数后所得到的不同质量的图像

像下图这一张老虎图,是一张压缩后的图,一黑白图,注意这个位图不是彩色是因为像素代表的聚类后的颜色对应的指针
。

参考资料
Kmeans算法原理与应用-RGB图像压缩
Image-compression-with-Kmeans-clustering