使用 PHP 检测图像的颜色

Posted

技术标签:

【中文标题】使用 PHP 检测图像的颜色【英文标题】:Detecting colors for an Image using PHP 【发布时间】:2011-12-05 09:13:27 【问题描述】:

如何在 php 中检测图像的前 2 种颜色?

例如我有这张图片:

此函数/进程将返回:0000FFblueFFFF00YELLOW

谢谢

【问题讨论】:

这可能适合你:***.com/questions/3468500/… 谢谢,太棒了。你能把它作为答案吗? 【参考方案1】:

这里有一个脚本可以为您提供列表:

function detectColors($image, $num, $level = 5) 
  $level = (int)$level;
  $palette = array();
  $size = getimagesize($image);
  if(!$size) 
    return FALSE;
  
  switch($size['mime']) 
    case 'image/jpeg':
      $img = imagecreatefromjpeg($image);
      break;
    case 'image/png':
      $img = imagecreatefrompng($image);
      break;
    case 'image/gif':
      $img = imagecreatefromgif($image);
      break;
    default:
      return FALSE;
  
  if(!$img) 
    return FALSE;
  
  for($i = 0; $i < $size[0]; $i += $level) 
    for($j = 0; $j < $size[1]; $j += $level) 
      $thisColor = imagecolorat($img, $i, $j);
      $rgb = imagecolorsforindex($img, $thisColor); 
      $color = sprintf('%02X%02X%02X', (round(round(($rgb['red'] / 0x33)) * 0x33)), round(round(($rgb['green'] / 0x33)) * 0x33), round(round(($rgb['blue'] / 0x33)) * 0x33));
      $palette[$color] = isset($palette[$color]) ? ++$palette[$color] : 1;  
    
  
  arsort($palette);
  return array_slice(array_keys($palette), 0, $num);


$img = 'icon.png';
$palette = detectColors($img, 6, 1);
echo '<img src="' . $img . '" />';
echo '<table>'; 
foreach($palette as $color)  
  echo '<tr><td style="background:#' . $color . '; width:36px;"></td><td>#' . $color . '</td></tr>';   
 
echo '</table>';

【讨论】:

我会通过将 Switch Case 替换为 $img = @imagecreatefromstring(file_get_contents($image)); 来优化这一点,这样您就可以有效地处理不同的图像类型... 这看起来你基本上是在循环中获取每个像素的颜色值。我认为如果 IMagick 可用,抓取图像直方图可能会更有效。 php.net/manual/en/imagick.getimagehistogram.php【参考方案2】:

如果您可以调用外部实用程序,Imagemagick 可以为您生成直方图。它可能会比 PHP 实现快得多。

基本上,此命令会为您提供一个颜色列表,按最显着的顺序排列:

convert 'http://i.stack.imgur.com/J2txV.png' -format %c histogram:info:-|sort -r

您可能希望首先将图像映射到固定调色板(“四舍五入”颜色)。这是我使用的:

convert 'http://i.stack.imgur.com/J2txV.png' -modulate 100,200,100 -remap 'http://i.stack.imgur.com/GvTqB.png' -format %c histogram:info:-|sort -r

【讨论】:

以上是关于使用 PHP 检测图像的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Opencv:将使用视频的代码更改为使用轨迹栏进行颜色检测的图像

检测图像中的一团颜色

如何使用 OpenCV Python 检测颜色

调整图像大小后检测公差颜色

图像处理:在(相当)相同的背景颜色上检测对象的边界

火灾检测基于matlab实现图像特征火灾检测