使用PHP从图像中获取最具视觉效果的颜色

时间:2010-11-03 01:24:03

标签: php image colors gd

问题:是否可以在php中获取颜色亮度值?

我要做的是使用PHP从图像中获取最“视觉上突出”的颜色。我已经完成了Stack Overflow的所有操作,但我找不到任何解决方案。

目前,我已经通过图像构建了颜色搜索,这些图像循环遍历图像的每个像素,存储颜色,计算颜色差异和亮度值,然后将其存储在数据库中。

问题:结果在数学上是正确的,但是它们在视觉上对于以前匹配颜色的图像不准确。我认为某种亮度比较可能会解决这个问题。

我注意到当我按升序(最低的第一个)命令结果时,结果实际上更准确(尽管在某些情况下不准确)。这意味着颜色出现值远低于订购DESC(最高的第一个)时的颜色。

为了计算“亮度”,我正在使用它 - 我不相信它那么强大:

function luminance($pixel){

   $pixel = sprintf('%06x',$pixel);
   $red = hexdec(substr($pixel,0,2))*0.30;
   $green = hexdec(substr($pixel,2,2))*0.59;
   $blue = hexdec(substr($pixel,4))*0.11;

   return $red+$green+$blue;
}

以下是一个显示问题的方案: http://twitpic.com/33e23p http://twitpic.com/33e3x0

我也开始怀疑我的色彩距离功能是否找不到最相似的颜色:

function colorDistance(array $color1, array $color2) {
  return sqrt(pow($color1[0] - $color2[0], 2) +
    pow($color1[1] - $color2[1], 2) +
    pow($color1[2] - $color2[2], 2));
}

1 个答案:

答案 0 :(得分:1)

由于您的色彩空间为standard RGB,因此维基百科文章Luminance (relative)表示您对R,G和B的乘数应为

  • R:0.21
  • G:0.72
  • B:0.07
而不是你拥有的。所以

function luminance($pixel){

   $pixel = sprintf('%06x',$pixel);
   $red = hexdec(substr($pixel,0,2))*0.21;
   $green = hexdec(substr($pixel,2,2))*0.72;
   $blue = hexdec(substr($pixel,4))*0.07;

   return $red+$green+$blue;
}