图像RGB颜色的平均值

6
我正在尝试用PHP计算图像的RGB颜色平均值。我使用gd库进行编程。
    $x = imagesx($im);
    $y = imagesy($im);
    for ($i = 0;$i < $x;$i++)
        for ($j = 0;$j < $y;$j++){
            $rgb = imagecolorat($im,$i,$j);
            $sum['R'] += ($rgb >> 16) & 0xFF;
            $sum['G'] += ($rgb >> 8) & 0xFF;
            $sum['B'] += $rgb & 0xFF; 
        }

但我认为这并不是一个好的方法。它需要大量的内存来处理。还有其他的方法吗?


2
将图像大小调整为1px x 1px曾经可以给出一个良好的平均值。 - Willian
2
@William:可能取决于所使用的缩放算法。 ;) - FrustratedWithFormsDesigner
2个回答

5

我会选择重新采样:

$tmp_img = ImageCreateTrueColor(1,1);
ImageCopyResampled($tmp_img,$im,0,0,0,0,1,1,$x,$y); // or ImageCopyResized
$rgb = ImageColorAt($tmp_img,0,0);

2
默认的重采样算法是什么?我希望不是最近邻插值。 - Mark Ransom

3

其中一种方法是将图片缩放到一个像素,然后使用该像素的颜色作为参考。

<?php
$image = new Imagick('800x480.jpg');
$image->scaleImage(1, 1, true);
$pixel = $image->getImagePixelColor(0,0);

$red   = ($rgb >> 16) & 0xFF;
$green = ($rgb >> 8) & 0xFF;
$blue  =  $rgb & 0xFF; 
?>

那样你就不需要处理混乱的细节。并且你可以使用更智能的缩放算法来实现更好的精度。
编辑:如果你需要更复杂的算法,可以使用Imagick::resizeImage,它可以使用不同的插值滤波器算法。

更智能的缩放算法在这种情况下并不是更好的解决方案。完美的缩放算法只需将所有源像素平均到目标像素即可。例如,双三次插值会更不准确。 - Mark Ransom
是的,但这将是一个非常快速和高效的算法,代价是准确性会降低,因为通常情况下效率与准确性是有矛盾的。 - Mehran
1
唯一比简单平均更快更高效的算法是最近邻选择,但这是最糟糕的结果 - 它只会选择图像中心附近的像素。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接