你有没有想过,某一天,当你打开新浪微博的时候,整个界面自动变成了你喜欢的颜色,那会是一种多么奇妙的感受?又比如我们要送礼物,为了给收礼物的人创造一种惊喜的感觉,基于保密的需要,就不能让收礼物对象知道我们的意图。这时候通过其他方法获得此人所喜欢的色彩就显得尤为重要。
本文描述了一种基于用户的照片来判断其对于颜色的喜好的方法。除了以上用途之外,本算法还可以用于进行数据挖掘,即分析用户对于颜色的偏好,从而极大地增强用户的体验。然而由于很多技术问题还没有得到解决,要用软件实现这个算法的自动化是非常困难的。
不适用于生产环境
由于以下几点原因,这个算法还不在生产环境中使用:
- 任何模型只能无限接近真实世界,误差会无可避免的存在,而这个算法的误差还不清楚。
- 没有足够数量的实验来证明这个算法的准确性。
- 大量的技术问题还没有得到解决,目前该算法只能手动操作。
背景知识:RGB 颜色模型
RGB 颜色模型,又称之为红绿蓝颜色模型。 其实现方法为,将红、绿、蓝三种颜色的光按照不同比例叠加,形成多种多样的色彩。而在计算机中常用的24比特模式,则将图像的每一个像素使用三个8位无符号整数(0到255)表示红色、绿色和蓝色的强度。这样的话就得到了16,777,216种颜色 (图1)。这时候,大多数人已经认为色彩非常真实了。
将颜色标示为不同的 RGB 值是这个算法的基础。因为如果不把颜色量化的话,任何的数学上的分析都无法进行。
图1: 红绿蓝颜色模型 (Wikipedia, 2014,http://zh.wikipedia.org/wiki/File:RGBR.png)
算法的假设
和任何模型一样,这个算法是基于以下几个假设的,也就是说,如果以下假设不成立,这个算法极有可能不会工作。
- 人如果把什么东西拿在手上拍照并且发到网上,说明这是他(她)喜欢的东西。也是就是说,如果照片中的人是从事展示,销售等工作行为,此算法将可能不会工作。
- 人在购买帽子,鞋子或者其他饰品等的时候,比购买衣服的时候更加注重它们的颜色。
- 人在拍照时候穿的帽子,鞋子或者其他饰品,一定是(他)她喜欢的。所以对于穿校服的学生,此算法不会工作。
- 假设一个人只有一种最喜欢的颜色,多色的算法还需要进一步研究。
- 第一条的确定性,高于第二条和第三条。
权重的设计
基于以上几个假设,照片中各个部分的权重可以设计如下:
表 1: 图片中不同部分权重的设计
项目 | 权重 |
拿在手中的东西 | 3.0 |
饰品和背包 | 2.5 |
帽子 | 2.0 |
鞋子 | 2.0 |
衣服裤子 | 1.0 |
为什么衣服裤子的权重低,是基于以下几个方面的考虑:
- 他(她)可能那天没有衣服穿了,尤其是男生。
- 衣服和裤子更注重整体的搭配,而不是单独某一件的色彩.
- 衣服和裤子会因为工作等的需求而变化,不能充分反映一个人的喜好(例如见客户穿黑色,本命年穿红色).
算法的数学基础
算法本身,是一个非常简单的加权平均算法。即将各部分的 RGB 值与上面所设计的权重加权平均,就得到了总体的 RGB 值。
为了验证算法可能造成的误差,我们还需要求出 RGB 值的标准误 (Standard Error)。均值标准误差等于样本标准差除以样本数量的平方根。如果 SE 较大,则算法的某些地方一定是出了问题,结果将非常不可靠。
取样工具
在Mac OS X的“应用程序”中的“实用工具”下有数码测色计,这是最好用的取样工具。使用时只需要把显示类型调成“原生值”即可得到相当准确的结果,同时,通过调整光圈的大小,可以将一款区域中的像素自动平均,从而起到减小误差的效果。苹果官方对该工具的使用方法描述如下:
要使用“数码测色计”匹配颜色:
- 打开“数码测色计”,它位于“应用程序”文件夹的“实用工具”文件夹中。
- 从弹出式菜单中选取一种颜色空间。
- 将指针移动到您想要匹配的像素上。当您移动指针时,颜色值会显示在框中。
取样点的设计
取样点的设计是整个算法的重要环节,这也是这个算法很难用程序来实现的主要原因。取样点可以是:衣服裤子,饰品,帽子,背包,拿在手里的东西等
1. 高光和阴影对取样有极大的影响
相同色彩的物品,在极其明亮和极其暗淡的环境中,所表现出来的颜色是不同的,图2 就是一个很好的例子。这是本算法一个非常薄弱的地方,因为这一步需要通过主观判断来选择最适合的测量点。
图2:单色蓝色 LED 在不同强度之下的表现,可以看到 LED 本身显示出的颜色为白色,而光强较弱的地方颜色为深蓝色。
2. 图像处理软件会影响颜色
一旦图像被处理过,很可能色彩已经发生了变化。我们认为,调整饱和度,对比度等的处理对最后的结果影响不大,而使用晚霞渲染, LOMO 等效果则会对颜色产生较大的影响。所以在取样的时候应该避免使用处理过的图片。
图3: 使用光影魔术手进行晚霞渲染之后的照片(右),可以看到颜色已经发生了变化。
3. 一个物体可能有多种颜色
对于一个物体有多种颜色的情况,如果物体是由某一个颜色为主,其他颜色只是做点缀的话,则只算占主导地位的这一种颜色。如果是由多种比例差不多的颜色组成,则应该将每一种颜色作为一个单独的物体来考虑。
4. 在一个对象中采多个样本平均可以减少误差
统计学方法的应用,可以增加这个算法的可靠性,同时使用的图片越多,样本数量就越多,同样的误差就越小。
5. 超过一年的照片不要使用
人对颜色的喜好不是一成不变的,超过一年的照片很可能已经不能代表他(她)所喜欢的颜色了。
6. 非黑即白
黑白搭配是一种非常常见的搭配方式,然而用本算法算出来的结果很可能是灰色,所以应该避免在非黑即白的环境中使用本算法。
其他的技术问题
除了取样点的问题之外,还有一些技术问题也需要解决:
- 衣服,鞋子,帽子,视频的识别:尤其是帽子和饰品,由于形状的缘故,识别是非常困难的。
- 如何判断一个东西是拿在手上,还是放在某个地方?
- 实现自动化之后所消耗的计算资源如何,能否以一个经济的方式来实现?
可能的解决方法
1. 排除照片中的人物,对以下的部分进行取样分析。这种方法可能会带来极大的误差。因为环境的色彩往往是比较混乱的。
2. 只识别照片中的特定元素,比如包。这种方法并无法解决上面的第二这个问题,同时需要的照片数量会非常之多。
做个软件没准会很实用
做个手动的倒好办,要做出自动化的分析软件所需要的能力,远在我的实力之上啊…….
我觉得不太准
当时是为了送人东西,才设计了这样一个玩意,结果那次的结果非常的准确。不过客观的来讲,这玩意的误差我觉着应该还是大的,最多只能做一个粗略的判断。