课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
用户视觉体验无论是在软件开发还是网页设计中都是非常重要的参考因素之一。今天我们就一起来了解一下,颜色的量化是如何实现的。
1.颜色量化算法
彩色图像一般采用RGB色彩模式,每个像素由RGB三个颜色分量组成。随着硬件的不断升级,彩色图像的存储由初的8位、16位变成现在的24位、32真彩色。所谓全彩是指每个像素由8位($2^8$=0~255)表示,红绿蓝三原色组合共有1677万($256*256*256$)万种颜色
2.中位切分法(Mediancut)
GitHub:color-theif项目采用了Leptonica中的用到的(调整)中位切分法,Js代码比C要易读得多。中位切分算法的原理很简单直接,将图像颜色看作是色彩空间中的长方体(VBox),从初始整个图像作为一个长方体开始,将RGB中长的一边从颜色统计的中位数一切为二,使得到的两个长方体所包含的像素数量相同,重复上述步骤,直到终切分得到长方体的数量等于主题颜色数量为止。
Leptonica作者在报告Median-CutColorQuantization中总结了这一算法存在的一些问题,其中主要问题是有可能存在某些条件下VBox体积很大但只包含少量像素。解决的方法是,每次进行切分时,并不是对上一次切分得到的所有VBox进行切分,而是通过一个优先级队列进行排序,刚开始时这一队列以VBox仅以VBox所包含的像素数作为优先级考量,当切分次数变多之后,将体积*包含像素数作为优先级。
3.八叉树算法(Octree)
八叉树算法的原理可以参考这篇文章:圖片主題色提取算法小結。作者也提供了Js实现的代码,虽然与Leptonica中C实现的方法差别很大,但原理上是一致的。
建立八叉树的原理实际上跟上面提到的统计直方图有些相似,将颜色成分转换成二进制之后,较低位(八叉树中位置较深层)数值将被压缩进较高位(八叉树中较浅层)。八叉树算法应用到主题色提取可能存在的问题是,每次削减掉的叶子数不确定,但是新增加的只有一个,这就导致我们需要的主题色数量并不一定刚好得到满足,例如设定的主题色数量为7,可能上一次叶子时总数还有10个,到了下一次只剩5个了。类似的问题在后面手动实现的KMeans算法中也有出现,为了保证可以得到足够的主题色,不得不强行提高算法中的颜色数量,然后取图像中包含数量较多的作为主题色
4.色彩建模
从上面几种算法结果来看,MMCQ和KMeans在时间和结果上都还算不错,但仍有改进的空间。如果从人类的角度出发,两种算法的策略或者说在解决主题色提取这一问题时采纳的特征(feature)都接近于颜色密度,即相近的颜色凑在一起数量越多,越容易被提取为主题颜色。
节选:伯乐在线
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。