El *_*obo 31 language-agnostic algorithm math colors rounding
前言
作为我正在研究的项目的一部分,我正在尝试提供一种在我们的系统中搜索图像的便捷方式.我们目前通过各种类型的用户添加的元数据(例如标题,描述,关键字)和我们提取的各种元数据(例如EXIF,IPTC,XMP等)提供搜索.我还想添加一个类似于你在谷歌图片搜索中看到的"颜色搜索".
该项目使用PHP,我们可以使用Imagemagick扩展来分割和量化图像,并从图像中提取最"重要"的颜色; 我不完全确定我到达的结果,但它们似乎相当准确,当然比没有好.
问题
我遇到困难的一点就是将这些重要的颜色转换成一组有代表性的颜色,例如,当你看谷歌的图像搜索时,那里有一组12种颜色.我想在数学上将我的颜色值"舍入"到最近的代表颜色,这样我就可以用我检测到的颜色索引图像,然后以这种方式面对我的搜索结果.
有什么建议?
Ali*_*aru 87
第一步是定义要比较的颜色.
第二步是找到从您的颜色到您在上一步中选择的颜色之一的最小距离.为了能够测量该距离,您需要一个欧几里德空间来对颜色进行建模.
当然,简单的选择是RGB空间

并且两种颜色C 1(r 1,g 1,b 1)和C 2(r 2,g 2,b 2)之间的距离将是
sqrt((r 1 -r 2)2 +(g 1 -g 2)2 +(b 1 -b 2)2).
但是如果你需要更高的精度,最好使用Hue-Chroma-Lightness双锥空间,HSL圆柱的衍生物.

在RGB空间中,东西直接作为R,G和B,每个都在一个单独的轴上.在HCL中,我们需要计算每个轴上的坐标.
首先,我们计算色度(与饱和度有点不同):
色度=最大(红色,绿色,蓝色) - 分钟(红色,绿色,蓝色)
然后我们将H,C和L值标准化,使H从0变为2(如果我们乘以PI并以弧度为单位,则覆盖一个圆),C从0变为1(三角圆的半径) L从-1(黑色)变为1(白色).
接下来我们采用z = L而没有任何变换,因为从图像中可以清楚地看到它沿着垂直轴.
我们可以很容易地观察到,对于颜色,色度是距离z轴的距离,而色调是角度.所以我们得到了
x = C*cos(H*PI)和
y = C*sin(H*PI)
此时,x,y和z都将在[-1,1]中,两种颜色之间的距离将使用与上述相同的公式,
sqrt((x 1 -x 2)2 +(y 1 -y 2)2 +(z 1 -z 2)2).
为了获得更高的精度并根据人类颜色感知找到最接近的颜色,您可以使用CIE-L*ab建模空间并使用其中一种算法计算距离.原理与上面提到的两种情况相同,只是算法更复杂.
更新(7年后)
最后xkcd推出了一个我可以在这篇文章中使用的漫画!