我正在使用php,逐个像素地浏览每个图像以获得每个图像的平均亮度,这将成为cpu密集型的...
我已经浏览了GD和imagemagick文档,但还没有找到一种方法来返回图像的平均亮度...这可以在这些库中快速完成,也可以通过php轻松访问的另一个包中完成?
答案 0 :(得分:3)
Here是一篇有趣的文章,使用ImageMagick来计算图片的平均灰度。这篇文章还讨论了Mark Ransom使用ImageMagick将尺寸减小到1x1的技术。
答案 1 :(得分:1)
样本?只需选择10%的随机像素而不是100%...错误率会明显上升但10%的像素对我来说似乎很好,在大多数情况下它应该会产生很好的结果!
答案 2 :(得分:0)
如果多次使用值,则将其缓存一次,因为这不是一个快速的解决方案。我首先尝试使用imagick将图像大小调整为1x1像素,但效果并不理想。没有imagick调整大小,我得到的最佳结果是,但是在显示大图像时非常慢。该示例将尺寸调整为1000x1000像素。请记住,此示例未涵盖具有Alpha通道的图像。
function getImageBrightness( $path )
{
$width = 1000;
$height = 1000;
try
{
$imagick = new imagick( $path );
$imagick->resizeImage( $width, $height );
$_brightness = 0;
for( $i=0; $i < $width; $i++ )
for( $j=0; $j < $height; $j++ )
if( $pixel = $imagick->getImagePixelColor($i, $j) )
if( $colors = $pixel->getColor() AND isset($colors['r']) )
{
$brightness = ($colors['r'] + $colors['g'] + $colors['b']) / (3* 255);
$_brightness = $brightness + $_brightness;
}
$_brightness = $_brightness / ( $height * $width );
return $_brightness; // from 0 (black) to 1 (white)
} catch( ImagickException $e )
{}
return 0.5; // default
}
答案 3 :(得分:0)
在Imagemagick命令行中,您可以转换为HSI或LAB,并从I或L通道的平均值获得亮度(强度或光度)。这些方法均应起作用。注意,-scale 1x1对整个图像/通道进行简单的平均,并将该值保存在1个像素的结果中。 -规模非常快。它与-resize不同,后者使用特定的过滤器功能。另外,您也可以只计算图像的均值,而无需写入1个像素。
convert image -colorspace HSI -channel b -separate +channel -scale 1x1 -format "%[fx:100*u]\n" info:
convert image -colorspace LAB -channel r -separate +channel -scale 1x1 -format "%[fx:100*u]\n" info:
convert image -colorspace HSI -channel b -separate +channel -format "%[fx:100*u.mean]\n" info:
convert image -colorspace LAB -channel r -separate +channel -format "%[fx:100*u.mean]\n" info:
convert image -colorspace HSI -channel b -separate +channel -format "%[mean]\n" info:
convert image -colorspace LAB -channel r -separate +channel -format "%[mean]\n" info:
结果将在0到100%之间,除最后两个外,其余所有颜色均为0,黑色为100,白色为100,其中fx范围在0和1之间。因此,获得百分率的100因子。对于最后两个命令,该值将在Q8安装的0-255和Q16安装的0-65535之间。
请注意,通道被依次标记为r,g,b。但是对于现代版本的Imagemagick,您可以使用0,1,2。
或者,您可以获取通道的像素颜色,该颜色将是一些灰度值:
convert image -colorspace HSI -channel b -separate +channel -scale 1x1 -format "%[pixel:u.p{0,0}]\n" info:
convert image -colorspace LAB -channel r -separate +channel -scale 1x1 -format "%[pixel:u.p{0,0}]\n" info:
抱歉,我不认识Imagick,但请参阅
http://us3.php.net/manual/en/imagick.scaleimage.php
http://us3.php.net/manual/en/imagick.getimagepixelcolor.php
http://us3.php.net/manual/en/imagick.transformimagecolorspace.php
http://us3.php.net/manual/en/imagick.getimagechannelstatistics.php
或可能
http://us3.php.net/manual/en/imagick.getimageproperty.php
也许Imagick专家会很友好地将这些命令之一从命令行转换为Imagick代码。
答案 4 :(得分:0)
Imagick具有直方图功能,可以按计数返回颜色。您可以更快地对相同信息求平均,而无需逐像素处理。
性能将取决于图像/直方图中的颜色数量(例如,一张彩色图像将非常快)。
<?php
$image = new Imagick('image.jpg');
$pixels = $image->getImageHistogram(); // Generate histogram of colors
$sumbright = 0; // sum of brightness values
$cntbright = 0; // count of pixels
foreach($pixels as $p){
$color = $p->getColor(); // Get rbg pixel color
$cnt = $p->getColorCount(); // Get number of pixels with above color
$sumbright += (($color['r'] + $color['g'] + $color['b']) / (3*255)) * $cnt; // Calculate 0.0 - 1.0 value of brightness (0=rgb[0] 1=rgb[255])
$cntbright += $cnt;
}
$avgbright = $sumbright / $cntbright; // Average 0-1 brightness of all pixels in the histogram
?>