如何运用k-means聚类进行图像识别、色彩压缩

点击上方关注,All in AI中国

如何运用k-means聚类进行图像识别、色彩压缩

300种颜色到24种颜色

对任何人来说,图像应用过滤器都不是一个新概念。我们拍了一张照片,做了一些修改,现在看起来更酷了。但是人工智能从何而来呢?让我们尝试使用Python中的k均值聚类进行无监督机器学习。

我以前写过关于k均值聚类的文章,所以我假设你这次对这个算法很熟悉。 如果你不是,可以看下我写的深入介绍K-Means Clustering: Diving into Unsupervised Learning | Data Stuff

我还尝试用自动编码器进行图像压缩,取得了不同程度的成功。

然而,这一次,我的目标不是重建最好的的图像,而是看看用尽可能少的颜色重新创建图片的效果。

那么我们应该怎么做呢?

如何用k均值聚类进行图像过滤

首先,最好记住图像只是像素向量。每个像素是由0到255之间的三个整数值(无符号字节)组成的元组,它们表示像素的颜色的RGB值。

我们想要用K个均值聚类来找到K个最能代表图像的颜色。这仅仅意味着我们可以将每个像素看作一个单一的数据点(在三维空间中),并将它们聚在一起。

首先,我们要用Python把图像转换成像素向量。我们是这样做的。

如何运用k-means聚类进行图像识别、色彩压缩

例如,也许我们的照片只有三种颜色:两种红色和一种绿色。如果我们把它放到两个集群中,所有红色的像素都会变成不同的红色(聚集在一起),其他的像素会变成绿色的。

但是这些解释已经足够了,让我们看看这个程序是如何运行的!

像往常一样,你可以自由地使用任何你想要的pic运行它,这里是带有代码的GitHub存储库GitHub - StrikingLoo/K-means-image-compression: Applying K-means clustering to image compression

或者,也许我们的照片只有三种颜色:两种红色,一种绿色。 如果我们将它放到两个集群中,所有红色像素将变成一些不同的红色阴影(聚集在一起),而其他像素将变成一些绿色的像素。

但这些解释已经足够了,让我们看看这个程序是如何运行的。像往常一样,您可以自由地使用您想要的任何图片运行它,这里是带有代码的GitHub存储库。GitHub - StrikingLoo/K-means-image-compression: Applying K-means clustering to image compression

结果

我们将把过滤器应用到小猫的照片上,照片从"猫狗大战"kaggle数据集中找到。

我们从一只猫的照片,然后对k应用不同值的滤镜。这里是原始的图片:

如何运用k-means聚类进行图像识别、色彩压缩

首先,让我们检查一下这幅图最初有多少种颜色。

如何运用k-means聚类进行图像识别、色彩压缩

只需要一行numpy,我们就可以计算一个像素在这幅图上所取的惟一值。尽管它总共有166167个像素,但在这张图片上有243种不同的颜色。

现在,让我们看一下将它聚类为2、5和10种不同颜色的结果。

如何运用k-means聚类进行图像识别、色彩压缩

只有两种颜色,它所做的只是标记最暗和最亮的区域。 然而,如果你是一个艺术家,用黑白(例如用墨水)绘画一些东西,并想看看参考轮廓是什么样的,那么这可能是有用的。

如何运用k-means聚类进行图像识别、色彩压缩

只有5种不同的颜色,这只猫已经可以辨认了

如何运用k-means聚类进行图像识别、色彩压缩

这10种颜色的图片可能看起来有点迷幻,但它很清楚地代表了原作的内容

你注意到了一个趋势吗? 我们添加的每种颜色都有递减的回报。 2种颜色和5种颜色之间的差异远大于5和10之间的差异。但是,对于10种颜色,平坦区域更小,我们有更多的粒度。 继续看15和24种颜色!

如何运用k-means聚类进行图像识别、色彩压缩

如何运用k-means聚类进行图像识别、色彩压缩

虽然很明显这是一张经过过滤的图片,有24种颜色(原始数量的10%),但我们已经很好地表现了猫的形象,并达到一定程度的细节。

换一幅不同的图片:一个是原始图片(256种不同的颜色),一个是压缩图片(还是24种颜色)。

如何运用k-means聚类进行图像识别、色彩压缩

有趣的是,"压缩"的图像为18KB,而未压缩的图像是16KB。我真的不知道为什么会这样,因为压缩机是相当复杂的野兽,但很乐意在评论中看到你的想法。

结论

我们只能用原来颜色的10%来制作新的图像,这看起来和它们非常相似。由于k均值聚类,我们还得到了一些看起来很酷的过滤器。你能想到其他有趣的集群应用程序吗?你是否认为其他聚类技术可以产生更有趣的结果?

相关推荐