我正在尝试根据图像的“饱和度”为图像赋值,以查看图像是黑白还是彩色.我正在使用Imagick,并且发现了似乎是命令行的完美代码,并尝试使用
PHP库复制它.
我想我理解这个概念:
>将图像转换为HSL.
>提取’g’通道(HSL中的S通道).
>计算此渠道的平均值.
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对[平均] => 31380.528443457 [standardDeviation] => 19703.501101904.
彩色图像给出0.565309对比[平均] => 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]');
但是当我尝试设置格式时,我得到一个无法设置格式错误.我也尝试过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;