我正在编写一个图像搜索引擎,它允许用户按颜色搜索。作为其中的一部分,我需要确定图像是灰度(仅包含黑色,白色或灰色阴影)还是包含任何颜色。
如何检测图像是否包含黑色,白色和灰色阴影之外的任何像素?
答案 0 :(得分:3)
您必须使用imagecolorat()
遍历每个像素(参见示例#2)。
灰度颜色与红色,绿色和蓝色的值相同。如果找到值不同的像素,则它是包含颜色的图像(至少在技术上 - 带有颜色)就像RGB(100,102,103)
一样,人眼看起来会变得灰暗。)。
答案 1 :(得分:1)
根据服务器上安装的光栅图像套件,您可以使用这些工具获得比Pekka在此处提供的更简单,更准确的答案。这是否更快是一个公开的论点(见下面的注释)。
在下面的ImageMagick示例(和链接)中,建议:
将图像转换为HSL,然后输出详细信息 (“识别”统计数据)
分析详细信息可以为您提供问题的答案;因此准确,简单,无需猜测“近”灰色图像。它还提供您可以使用的其他数据,具体取决于您的工作流程和需求。
来源:http://www.imagemagick.org/discourse-server/viewtopic.php?t=19580
我怀疑这是更快而不是Pekka的解决方案,因为转换图像无论如何都会基本上遍历像素。
所以,Pekka对速度的回答。这个答案是为了精确。
答案 2 :(得分: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;
}