Я пытаюсь присвоить значение изображению на основе его «уровня насыщенности», чтобы увидеть, является ли изображение черно-белым или цветным. Я использую Imagick и нашел то, что кажется идеальным кодом для командной строки, и пытаюсь воспроизвести его с помощью библиотеки PHP.
Я думаю, что я понимаю концепцию:
- Преобразование изображения в HSL.
- Извлеките канал «g» (который является каналом S в HSL).
- Вычислите среднее значение этого канала.
Код командной строки
convert '$image_path' -colorspace HSL -channel g -separate +channel -format '%[fx:mean]' info:
Мой PHP-код
$imagick = new Imagick($image_path);
$imagick->setColorspace(imagick::COLORSPACE_HSL);
print_r($imagick->getImageChannelMean(imagick::CHANNEL_GREEN));
Выход
Однако мой PHP-код не выводит такие же значения, как код командной строки. Например, изображение в градациях серого дает 0
для кода командной строки, а код PHP дает [mean] => 10845.392051182 [standardDeviation] => 7367.5888849872
.
Точно так же другое изображение в градациях серого дает 0
против [mean] => 31380.528443457 [standardDeviation] => 19703.501101904
.
Красочное изображение дает 0.565309
против [mean] => 33991.552881892 [standardDeviation] => 16254.018540044
.
Кажется, что между различными значениями нет никакой закономерности. Я делаю что-то явно не так?
Спасибо.
Просто чтобы добавить, я также пробовал этот PHP-код
$imagick = new Imagick($image_path);
$imagick->setColorspace(imagick::COLORSPACE_HSL);
$imagick->separateImageChannel(imagick::CHANNEL_GREEN);
$imagick->setFormat('%[fx:mean]');
Но я получаю ошибку Unable to set format
, когда пытаюсь установить формат. Я также пробовал setFormat('%[fx:mean] info:')
, setFormat('%[mean]')
, setFormat('%mean')
и т. д.
Обновление — ИСПРАВЛЕНО!
Спасибо @danack за то, что он понял, что мне нужно использовать transformImageColorspace()
, а не setColorspace()
. Рабочий код ниже.
$imagick = new Imagick($image_path);
$imagick->transformImageColorspace(imagick::COLORSPACE_HSL);
$saturation_channel = $imagick->getImageChannelMean(imagick::CHANNEL_GREEN);
$saturation_level = $saturation_channel['mean']/65535;