Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 快速获取图像的亮度/亮度_Php_Image Processing_Imagemagick_Gd - Fatal编程技术网

Php 快速获取图像的亮度/亮度

Php 快速获取图像的亮度/亮度,php,image-processing,imagemagick,gd,Php,Image Processing,Imagemagick,Gd,我在php中工作,逐像素检查每个图像以获得每个图像的平均亮度将是cpu密集型的方式 我查看了GD和imagemagick文档,但没有找到返回图像平均亮度的方法。。。这可以在这些库中快速完成,还是在php易于访问的另一个包中快速完成?示例?只需选取10%的随机像素,而不是100%。。。错误率将明显上升,但10%的像素对我来说似乎很好,在大多数情况下,它应该会产生伟大的结果 是一篇有趣的文章,用于计算图像的平均灰度。这篇文章还讨论了Mark Ransom使用ImageMagick将大小缩减为1x1的

我在php中工作,逐像素检查每个图像以获得每个图像的平均亮度将是cpu密集型的方式


我查看了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

?>