如何运用k-means聚类进行图像识别、色彩压缩
点击上方关注,All in AI中国
300种颜色到24种颜色
对任何人来说,图像应用过滤器都不是一个新概念。我们拍了一张照片,做了一些修改,现在看起来更酷了。但是人工智能从何而来呢?让我们尝试使用Python中的k均值聚类进行无监督机器学习。
我以前写过关于k均值聚类的文章,所以我假设你这次对这个算法很熟悉。 如果你不是,可以看下我写的深入介绍K-Means Clustering: Diving into Unsupervised Learning | Data Stuff。
我还尝试用自动编码器进行图像压缩,取得了不同程度的成功。
然而,这一次,我的目标不是重建最好的的图像,而是看看用尽可能少的颜色重新创建图片的效果。
那么我们应该怎么做呢?
如何用k均值聚类进行图像过滤
首先,最好记住图像只是像素向量。每个像素是由0到255之间的三个整数值(无符号字节)组成的元组,它们表示像素的颜色的RGB值。
我们想要用K个均值聚类来找到K个最能代表图像的颜色。这仅仅意味着我们可以将每个像素看作一个单一的数据点(在三维空间中),并将它们聚在一起。
首先,我们要用Python把图像转换成像素向量。我们是这样做的。
例如,也许我们的照片只有三种颜色:两种红色和一种绿色。如果我们把它放到两个集群中,所有红色的像素都会变成不同的红色(聚集在一起),其他的像素会变成绿色的。
但是这些解释已经足够了,让我们看看这个程序是如何运行的!
像往常一样,你可以自由地使用任何你想要的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应用不同值的滤镜。这里是原始的图片:
首先,让我们检查一下这幅图最初有多少种颜色。
只需要一行numpy,我们就可以计算一个像素在这幅图上所取的惟一值。尽管它总共有166167个像素,但在这张图片上有243种不同的颜色。
现在,让我们看一下将它聚类为2、5和10种不同颜色的结果。
只有两种颜色,它所做的只是标记最暗和最亮的区域。 然而,如果你是一个艺术家,用黑白(例如用墨水)绘画一些东西,并想看看参考轮廓是什么样的,那么这可能是有用的。
只有5种不同的颜色,这只猫已经可以辨认了
这10种颜色的图片可能看起来有点迷幻,但它很清楚地代表了原作的内容
你注意到了一个趋势吗? 我们添加的每种颜色都有递减的回报。 2种颜色和5种颜色之间的差异远大于5和10之间的差异。但是,对于10种颜色,平坦区域更小,我们有更多的粒度。 继续看15和24种颜色!
虽然很明显这是一张经过过滤的图片,有24种颜色(原始数量的10%),但我们已经很好地表现了猫的形象,并达到一定程度的细节。
换一幅不同的图片:一个是原始图片(256种不同的颜色),一个是压缩图片(还是24种颜色)。
有趣的是,"压缩"的图像为18KB,而未压缩的图像是16KB。我真的不知道为什么会这样,因为压缩机是相当复杂的野兽,但很乐意在评论中看到你的想法。
结论
我们只能用原来颜色的10%来制作新的图像,这看起来和它们非常相似。由于k均值聚类,我们还得到了一些看起来很酷的过滤器。你能想到其他有趣的集群应用程序吗?你是否认为其他聚类技术可以产生更有趣的结果?