颜色量化:图片主题色提取算法

24年元旦前一天,我和大多数人一样尝试着在照片库中选择23年最具代表的照片来做年度总结,看着全年拍摄的那么多照片,突发奇想:为何不把23年全年的照片汇聚到一张图中,用一个色块来表达各照片的主题色,从而可视化出“一年的颜色”。这个想法实现的关键是:提取一张照片的主题颜色。通过一定检索后发现这个背后还有一个很有趣的科学问题:颜色量化。

颜色量化(Color Quantization)是在保证图像表现力的前提下减少图像中的颜色数量,可以简单理解为颜色数简化。这个问题的提出源自解决在能显示出K个颜色数的可视化设备上,对N(N>K)个颜色数的图像做颜色映射,从而保证该设备上可以最大可能的展示出和原始图像相近效果。本文介绍几种常见的颜色量化算法。

均匀化颜色量化

均匀化颜色量化(Uniform Quantization)是最为简单的颜色量化算法,其主体思想是将RGB颜色空间按照一定间隔均匀等分,从而形成若干个颜色立方体,并使用立方体中某一位置(如中心)颜色或颜色计算值(如立方体所有颜色均值)作为落在该立方体内颜色的映射值。例如下图,将颜色按照红色轴、绿色轴和蓝色轴分别5等分,从而支持颜色表达为5*5*5=125个色度。当然通常而言是按照红色轴和绿色轴8等分,蓝色轴4等分(人眼对蓝色分辨率更低),从而表达256个色度。该算法虽然简单,但失真度较大。

流行色算法(Popularity Algorithm)选择图像中出现频率最高的K个颜色作为图像的颜色映射表,然后再计算选择映射表中距离图像各像素颜色值最近的颜色作为该像素的映射颜色,通常该距离度量选择欧氏距离。该算法在计算过程中寻找最高频K颜色时将十分消耗内存,同时,做颜色映射的距离度量方式虽然可以有多种选择,但是最终得到的效果也相对较差。

中值切割算法

中值切割算法(Median Cut Algorithm)算是一种均匀化颜色法的升级版,其逻辑还是将颜色空间划分为K个立方体,并用立方体中的颜色表达值(如均值)作为立方体内各颜色的映射值。和均匀化颜色法不同的是,中值切割算法对颜色空间的切割以原图像中的颜色值分布为依据。该算法初始化时先计算出原图像颜色空间的最小包围立方体,然后选择立方体中的较长边的方向作为下一步切分的颜色轴向,切分时,将该空间中的各个颜色按照该轴向进行排序,并选择颜色所在区间的中间位置进行空间剖分,每一次剖分后,选择各个立方体中像素数最多的立方体再重复中值切割(该部分网上大部分帖子没有说清楚),直到将图像颜色空间划分为K个立方体。如下图【引用1】,该方法得到量化效果还是相对较好的。

本质而言颜色量化其实就是颜色的聚类,即在颜色空间中选择最能表达各个颜色团的几个主颜色。所以在颜色聚类过程中即可采用K-Means算法来进行主颜色的提取。该算法首先可以随机选择K个颜色作为初始的颜色质心(主颜色),然后根据各个像素值与K个中心计算进行分类,该距离度量依然可以采用欧式距离,分类完成后,再重新计算各个颜色团的新中心,重复该聚类过直到中心稳定,则得到图像的主颜色。如下图采用K=8的聚类效果【参考2】。

八叉树颜色量化

八叉树颜色量化(Octree ColorQuantization)是将图像中所有的像素按照一定规则插入到八叉树中,该算法在插入的过程中会统计各个颜色频次,并在提取的颜色个数大于需要的颜色个数K时,通过八叉树节点合并,较小容差的聚合颜色数。该算法具有运行效率高,内存消耗低且量化效果好的特点,是应用最为广泛的算法[3]。该算法核心在于建立八叉树和节点合并。

  • 建立八叉树

如上图,对于图像中每一个像素的RGB颜色(十进制数字),分解为八位二进制数,每一位对应一个八叉树层级,对层级L上红绿蓝三个分量对应二进制转化为十进制数,该数即为该颜色在八叉树层级L中的序列数,从而构成该颜色的八叉树编码。对于图像的各个颜色都可以通过该方式进行编码,不同颜色在编码过程中,会重复利用某些层级上的序列,如颜色(63,57,253)和(63,57,252)的前7位编码将重复,而颜色数字越接近,重复的编码自上而下也就越多,该特性也是支撑八叉树节点合并的依据。

  • 节点合并

节点合并的本质是颜色的聚合,如上述,颜色越接近,其自上而下编码重复将越多,那么就可以自下而上进行节点合并。节点合并的准则包括:

  • 级别最大的子树首先合并。即在八叉树层次中自下而上进行颜色合并。

  • 级别相同则频度最小优先合并。在同级下需要合并多个节点时,对于频度低的优先被合并。

  • 合并后可以取被合并颜色的均值作为新节点的颜色

通过上述方式,即可完成图像的主色提取,之后再通过颜色映射即可完成图像颜色量化调整。

图像主色彩实现

有了上述算法储备后,即可完成对一年所有照片的主色提取。当时时间有限,没有自己实现算法,而是直接使用了Leptonica库。下图是用20色来量化图片的效果(左侧为原图,右侧为量化处理后图,底部色条为提取的主色)。

进一步,对一年里各种图片的主色提取并拼成“一年颜色”图。

图片

当时因为觉得只使用一个颜色表达一个照片不太科学,于是又用了4个主色色块拼成一个大块以代表一个照片色,效果如下。

图片

总结

图像的主题色在很多应用中都有使用到,例如网易云音乐的播放背景色会跟着播放歌曲的专辑图片主色而变化。通过颜色量化可以对图片进行压缩,降低数据的存储代价,当前也有部分学者基于此压缩图片后用于深度学习训练,其实如果结合心理学,还可以对一个照片进行情绪评价。在三维GIS系统中,图像颜色的量化可以用在实景三维数据压缩和归一化外观表达。

参考资料

[1] https://micro.magnet.fsu.edu/primer/java/digitalimaging/processing/colorreduction/index.html

[2] https://medium.com/analytics-vidhya/color-quantization-for-image-reduction-using-k-means-clustering-algorithm-321b33f4d5e8

[3] Gervautz, M., Purgathofer, W. (1988). A Simple Method for Color Quantization: Octree Quantization. In: Magnenat-Thalmann, N., Thalmann, D. (eds) New Trends

[4] Median Cut Algorithm. In: Furht, B. (eds) Encyclopedia of Multimedia. Springer, Boston, MA. https://doi.org/10.1007/978-0-387-78414-4_36in Computer Graphics. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-642-83492-9_20

[5] https://blog.csdn.net/qq_39238001/article/details/128908185

[6] https://zhuanlan.zhihu.com/p/220177037/

欢迎大家关注我的个人公众号,透彻分析更多有趣算法和技术细节

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值