gpt4 book ai didi

php - 使用 Imagick 检测图像是灰度还是彩色

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:38:32 25 4
gpt4 key购买 nike

我正在尝试根据图像的“饱和度”为图像分配一个值,以查看图像是黑白还是彩色。我正在使用 Imagick,并且发现了似乎是命令行的完美代码,并且正在尝试使用 PHP 库复制它。

我想我理解了这个概念:

  1. 将图像转换为 HSL。
  2. 提取“g” channel (HSL 中的 S channel )。
  3. 计算该 channel 的平均值。


Command line code

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('%意思是')



更新——已修复!

感谢@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;

最佳答案

setFormat 不复制命令行选项 -format - Imagick 中的选项尝试设置图像格式,应该是 png、jpg 等。命令行中的选项设置info 的格式 - 在 Imagick 中调用 $imagick->identifyImage(true) 并解析其结果的最接近匹配。

此外,您只是调用了错误的函数 - 它应该是 transformImageColorspace 而不是 setColorSpace。如果您使用它,您可以使用来自 getImageChannelMean 的统计信息。

还有其他方法可以测试灰度,这在某些情况下可能更合适。首先是将图像的克隆转换为灰度,然后将其与原始图像进行比较:

$imagick = new Imagick($image_path);
$imagickGrey = clone $imagick;
$imagickGrey->setimagetype(\Imagick::IMGTYPE_GRAYSCALE);

$differenceInfo = $imagick->compareimages($imagickGrey, \Imagick::METRIC_MEANABSOLUTEERROR);

if ($differenceInfo['mean'] <= 0.0000001) {
echo "Grey enough";
}

如果您的图像有颜色区域也是透明的,那么这可能是合适的 - 所以它们理论上有颜色,但不可见。

或者如果你只关心图片是否为灰度格式:

$imageType = $imagick->getImageType();
if ($imageType === \Imagick::IMGTYPE_GRAYSCALE ||
$imageType === Imagick::IMGTYPE_GRAYSCALEMATTE) {
//This is grayscale
}

关于php - 使用 Imagick 检测图像是灰度还是彩色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23922654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com