前言
作为我正在研究的项目的一部分,我正在尝试提供一种在我们的系统中搜索图像的便捷方式.我们目前通过各种类型的用户添加的元数据(例如标题,描述,关键字)和我们提取的各种元数据(例如EXIF,IPTC,XMP等)提供搜索.我还想添加一个类似于你在谷歌图片搜索中看到的"颜色搜索".
该项目使用PHP,我们可以使用Imagemagick扩展来分割和量化图像,并从图像中提取最"重要"的颜色; 我不完全确定我到达的结果,但它们似乎相当准确,当然比没有好.
问题
我遇到困难的一点就是将这些重要的颜色转换成一组有代表性的颜色,例如,当你看谷歌的图像搜索时,那里有一组12种颜色.我想在数学上将我的颜色值"舍入"到最近的代表颜色,这样我就可以用我检测到的颜色索引图像,然后以这种方式面对我的搜索结果.
有什么建议?
我想找到颜色名称,给出它的 RGB 值。
RGB 值示例为:(237, 65, 83)
预定义值
数组(11, '红色', '#FF0000', '255,0,0'),
array(3, '棕色', '#A52A2A', '165,42,42')
如果我使用这种方法距离计算
我得到的颜色是棕色的。
但如果我们在这里测试 RGB 值,实际颜色是红色
已编辑 1
<?php
$colors = array(
array(1, 'Black', '#000000', '0,0,0'),
array(2, 'Blue', '#0000FF', '0,0,255'),
array(3, 'Brown', '#A52A2A', '165,42,42'),
array(4, 'Cream', '#FFFFCC', '255,255,204'),
array(5, 'Green', '#008000', '0,128,0'),
array(6, 'Grey', '#808080', '128,128,128'),
array(7, 'Yellow', '#FFFF00', '255,255,0'),
array(8, 'Orange', '#FFA500', '255,165,0'),
array(9, 'Pink', '#FFC0CB', '255,192,203'),
array(11, 'Red', '#FF0000', '255,0,0'),
array(10, 'Purple', '#800080', '128,0,128'),
array(12, 'Tan', '#d2b48c', '210,180,140'),
array(13, 'Turquoise', '#40E0D0', …Run Code Online (Sandbox Code Playgroud) 我知道我需要使用循环来查看$palette数组,但我需要帮助进行颜色比较。
目标是找到的最接近的值$rgbcolor到$palette并显示颜色匹配的$palette。
<?php
//input color
$rgbcolor = array(110,84,43);
//listed color
$palette = array(
array(238,216,152),
array(252,216,113),
array(253,217,0),
array(255,208,62),
array(255,182,20),
array(206,137,0),
array(235,169,0),
array(170,137,0),
array(173,132,28),
array(183,131,0),
array(139,120,37),
array(108,86,26)
);
?>
Run Code Online (Sandbox Code Playgroud) 我在接受采访时被要求为以下问题创建一个有效的算法:
输入:
我们有一个RGB颜色列表.由3表示的每种颜色<x,y,z>在0到255之间坐标.此列表永远不会改变.
我们正在每当一些额外的颜色(不是一定从上面的列表),我们需要从列表返回最接近(距离任期)颜色的附加颜色.
笔记:
我们可以对颜色列表进行一些预处理,因为列表永远不会改变.
颜色之间的距离定义为:
d = ((x2 - x1)^2 + (y2 - y1)^2 + (z2 - z1)^2)^1/2
例:
让:列表:{<1,1,1>,<1,0,1>,<2,2,2>,<0,1,0>}
其他颜色:<0,0,0>
结果:最小距离<0,0,0>为<0,1,0>.
我试图解决这个问题:
显然,我们可以进行预处理并保留世界上的所有颜色对并保存距离,我们可以在O(1)运行时获得解决方案,但内存很大 (255^3*n)
最天真的解决方案是遍历列表并计算列表中每种颜色与附加颜色之间的距离,并返回最小距离的颜色.它的O(n)位置是n是颜色列表的长度.
我试图用x,y,z坐标对列表进行排序,并保持3个排序列表或按距离排序,<0,0,0>但我不知道如何继续使用它.
我也看到了这个,但问题不在于问题的算法方法.