我需要在图像中获得最主要的颜色,并成功找到与其对应的十六进制值( RGB )。接下来是将十六进制值映射到常用颜色(如红色,黄色,绿色,蓝色,紫色,粉红色,白色,灰色,黑色,棕色< / strong>等)。基本上我需要的是一种将范围的十六进制值映射到特定颜色的方法。 例如#ff5050,#ff1a1a,#e60000等是红色的。因此,如果输入#ff5050 ,则结果必须为红色。这样,所有十六进制值必须与上面提到的一些常见颜色匹配。 怎么能实现这个目标呢?
我更喜欢的编程语言是php。
答案 0 :(得分:0)
您可以在PHP中获取图片直方图。您可以在此处找到更多信息和代码示例:http://php.net/manual/en/imagick.getimagehistogram.php
要将颜色映射到html名称,您可以浏览颜色数组并使用您要查找的颜色计算颜色距离。距离最小的颜色是最好的html名称。您可以在此处找到有关色彩距离的更多资源:https://en.m.wikipedia.org/wiki/Color_difference
每次处理每张新图片时,这可能需要花费大量时间,因此更好的解决方案: 你是RGB颜色空间。这意味着您有256x256x256不同的颜色。每种颜色由RGB坐标 - http://www.w3schools.com/colors/colors_names.asp定义。例如'aqua'有RGB坐标(0,255,255)。您的目标是通过名称命名RGB空间中的所有颜色,但是您不需要RGB空间中非常单一颜色的唯一名称,因为您无法用眼睛区分每个细节(例如(0,0,1)和(0,0,2)看起来一样)。因此,您可以指定所需的颜色名称列表:
$colorNames = array(
[0] => 'white', //#FFFFFF
[1] => 'red', //#FF0000
...
);
现在,为了快速映射颜色 C ,由坐标(r,g,b)给出颜色名称,你必须查找,$ colorNames数组中的哪个索引对应颜色 C 的。为此,您可以提前准备一个文件,其大小为256 * 256 * 256 = 16MB。每个字节代表RGB空间中的一个点。字节的值是$ colorNames数组中颜色最相似的颜色索引。如何创建文件(伪代码):
for every value of R coordinate
for every value of G coordinate
for every value of B coordinate
find which color name in $colorName has the smallest distance to coordinates (R,G,B)
store the index for this color name to file
现在您拥有包含任何颜色的所有索引的文件。这意味着您现在要做的就是将任何颜色映射到名称,在此文件中读取一个字节并查看数组中的颜色名称。
open mapping file
read one byte on position (R*256*256 + G*256 + B)
this byte is the 'index' in colorNames array
read the color name (colorNames['index'])