图像的 RGB 颜色平均值

Posted

技术标签:

【中文标题】图像的 RGB 颜色平均值【英文标题】:average of RGB color of Image 【发布时间】:2011-08-05 21:25:07 【问题描述】:

我正在尝试在 php 中获取图像的 RGB 颜色的平均值。

通过 gd lib 我对其进行编程

    $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; 
        

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

【问题讨论】:

将图像大小调整为 1px x 1px 用于提供良好的平均值 @William:可能取决于所使用的缩放算法。 ;) 【参考方案1】:

我会重新采样:

$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】:

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

<?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。它可以使用不同的算法,如插值过滤器。

【讨论】:

在这种情况下,更智能的缩放算法并不是更好的解决方案。完美的缩放算法将简单地将所有源像素平均到目标像素中。例如,双三次会不太准确。 是的,但它会是一种更快、更高效的算法,但其代价是不太准确,因为效率通常是这种情况。 唯一比简单平均“更快、更有效的算法”是最近邻选择,这是最坏的结果——它只会选择图像中心附近的一个像素。

以上是关于图像的 RGB 颜色平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何向图像添加滤色器,以使其平均 RGB 更接近该颜色?

如何计算位图的平均 rgb 颜色值

缩小 32 位 RGB 图像的最快算法

javascript 使用画布计算图像的平均RGB

python 获取图像的RGB均值

如何计算RGB数字图像处理 亮度的亮度值