Быстро получить яркость / яркость изображений - PullRequest
1 голос
/ 05 января 2012

Я работаю в php, и прохождение каждого изображения попиксельно, чтобы получить среднюю яркость для каждого изображения, будет очень интенсивным процессором ...

Я просмотрелкак в GD, так и в документах imagemagick, но не нашли способа вернуть среднюю яркость изображения ... Это можно сделать быстро либо в этих библиотеках, либо в другом пакете, легко доступном для php?

Ответы [ 4 ]

3 голосов
/ 06 января 2012

Здесь - интересный пост, использующий ImageMagick для вычисления среднего уровня градации изображения.В этом посте также обсуждается методика уменьшения размера Марка Рэнсома до 1x1 с использованием ImageMagick.

1 голос
/ 05 января 2012

Пример?Просто выберите 10% случайных пикселей вместо 100% ... Частота ошибок, очевидно, возрастет, но 10% пикселей мне кажутся хорошими, в большинстве случаев это должно дать отличные результаты!

0 голосов
/ 14 июля 2018

В командной строке 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 для получения процента. Для последних двух команд значения будут в диапазоне от 0 до 255 для установки Q8 и от 0 до 65535 для установки Q16.

Обратите внимание, что каналы помечены по порядку, как если бы они были 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:


Извините, я не знаю Имагика, но вижу

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.

0 голосов
/ 13 июля 2018

Кэшируйте значения, если используете их более одного раза, потому что это не быстрое решение. Сначала я попытался изменить размер изображения до 1x1 пикселя с помощью imagick, но результаты оказались не очень хорошими. Лучшие результаты, которые я получил без изменения размера imagick, но это очень медленно с большими изображениями. Пример изменяет размер до 1000x1000 пикселей. Имейте в виду, что этот пример не охватывает изображения с альфа-каналом.

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
}
...