【问题标题】:PHP how to detect if image contains color?PHP如何检测图像是否包含颜色?
【发布时间】:2013-01-26 10:33:43
【问题描述】:

我正在编写一个图像搜索引擎,它允许用户按颜色进行搜索。作为其中的一部分,我需要确定图像是灰度(仅包含黑色、白色或灰色阴影)还是包含任何颜色。

如何检测图像是否包含黑色、白色和灰色阴影之外的任何像素?

【问题讨论】:

标签: php colors


【解决方案1】:

我提出以下功能。它的工作方式只是找到以像素为单位的 R-G-B 值的相似性。如果只有一个像素的 RGB 值不同,则可能是彩色图像。不过建议插入resize_uploaded()函数以节省时间。

function detect_greyscale($source_file)
{
    $im = resize_uploaded($source_file);    
    $imgw = imagesx($im);
    $imgh = imagesy($im);

    $count_grey = '';
    $count_color = '';

    for ($i=0; $i<$imgw; $i++)
    {
        for ($j=0; $j<$imgh; $j++)
        {
            $rgb = ImageColorAt($im, $i, $j); 
            $rr = ($rgb >> 16) & 0xFF;
            $gg = ($rgb >> 8) & 0xFF;
            $bb = $rgb & 0xFF;
            if($rr == $gg and $rr == $bb and $bb == $gg)
            {
                $count_grey++;
            }
            else
            {
                $count_color++;
            }
        }
    }
    imagedestroy($im);
    if($count_color>0)
    {
        return 0;
    }
    return 1;
}

【讨论】:

    【解决方案2】:

    根据服务器上安装的光栅图像套件,您可以使用这些工具获得比 Pekka 在此处提供的更简单、更准确的答案。这是否更快是一个公开的论点(见下面的注释)。

    在下面的 ImageMagick 示例(和链接)中,建议:

    将图像转换为HSL,然后输出详细信息 (“识别”统计数据)

    分析详细信息可以为您提供问题的答案;因此准确、简单,无需对“近”灰度图像进行猜测。它还提供您可能能够使用的其他数据,具体取决于您的工作流程和需求。

    来源:http://www.imagemagick.org/discourse-server/viewtopic.php?t=19580

    我怀疑这比 Pekka 的解决方案更快,因为无论如何转换图像本质上都会循环遍历像素。

    所以,Pekka 对速度的回答。这个答案是为了精确。

    【讨论】:

      【解决方案3】:

      您必须使用imagecolorat() 遍历每个像素(参见示例#2)。

      灰度颜色对于红色、绿色和蓝色将具有相同的值。如果您发现值不同的像素,则它是包含颜色的图像(至少从技术上讲 - 具有颜色比如RGB(100,102,103),它在人眼看来是灰色的。)。

      【讨论】:

      • 那么循环遍历每个像素并使用该函数检查每个像素?
      • 我认为,一旦您使用 Pekka 的方法找到一个彩色像素,您就可以停止。这将加快该过程,因为它可能是第一个像素!或者,您可以调整图像大小或仅选择要检查的区域。
      猜你喜欢
      • 2010-10-15
      • 2021-03-21
      • 2013-04-12
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多