Php 快速获取图像的亮度/亮度
我在php中工作,逐像素检查每个图像以获得每个图像的平均亮度将是cpu密集型的方式Php 快速获取图像的亮度/亮度,php,image-processing,imagemagick,gd,Php,Image Processing,Imagemagick,Gd,我在php中工作,逐像素检查每个图像以获得每个图像的平均亮度将是cpu密集型的方式 我查看了GD和imagemagick文档,但没有找到返回图像平均亮度的方法。。。这可以在这些库中快速完成,还是在php易于访问的另一个包中快速完成?示例?只需选取10%的随机像素,而不是100%。。。错误率将明显上升,但10%的像素对我来说似乎很好,在大多数情况下,它应该会产生伟大的结果 是一篇有趣的文章,用于计算图像的平均灰度。这篇文章还讨论了Mark Ransom使用ImageMagick将大小缩减为1x1的
我查看了GD和imagemagick文档,但没有找到返回图像平均亮度的方法。。。这可以在这些库中快速完成,还是在php易于访问的另一个包中快速完成?示例?只需选取10%的随机像素,而不是100%。。。错误率将明显上升,但10%的像素对我来说似乎很好,在大多数情况下,它应该会产生伟大的结果 是一篇有趣的文章,用于计算图像的平均灰度。这篇文章还讨论了Mark Ransom使用ImageMagick将大小缩减为1x1的技术。如果多次使用这些值,请缓存它们,因为这不是一个快速的解决方案。我首先尝试用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
}
函数getImageBrightness($path)
{
$width=1000;
$height=1000;
尝试
{
$imagick=新imagick($path);
$imagick->resizeImage($width,$height);
$\亮度=0;
对于($i=0;$i<$width;$i++)
对于($j=0;$j<$height;$j++)
如果($pixel=$imagick->getImagePixelColor($i,$j))
if($colors=$pixel->getColor()和isset($colors['r']))
{
$brightness=($colors['r']+$colors['g']+$colors['b'])/(3*255);
$\亮度=$亮度+$\亮度;
}
$\亮度=$\亮度/($高度*$宽度);
返回$\u亮度;//从0(黑色)到1(白色)
}捕获(ImagickException$e)
{}
返回0.5;//默认值
}
在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为白色,但最后两个除外,其中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,但请看 或者可能
也许Imagick专家会很乐意将这些命令中的一个从命令行转换为Imagick代码。Imagick具有按计数返回颜色的直方图功能。您可以更快地平均相同的信息,而无需逐像素处理 性能取决于图像/直方图中的颜色数量(例如,单色图像的速度非常快)
使用您选择的库将图像大小减小到1x1像素,然后读取该像素的值。为了清楚起见,我正在寻找luminance@MarkRansom谢谢,我喜欢这个建议。可惜它没有讨论1x1技术的优点或缺点。我认为有些库没有使用适当的采样方法来调整大小,并且会产生不准确的结果。另外,如果你的回答是对链接的总结,那么你的回答会更有力。链接终究会消亡。有趣。你有什么例子吗。
<?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
?>