PHP中图像中已更改的像素百分比

Maz*_*zzy 5 php imagemagick

目前我有一张图片,我从中检索背景颜色.我正在使背景颜色透明,然后尝试将其与原始图像进行比较,以确定由所述背景颜色组成的图像的百分比.这是我试图使用的代码:

$image = new Imagick($file);

// Make bg transparent for comparison
$tpImage = $image->clone();
$tpImage->setFormat('png');
$tpImage->setImagePage(0, 0, 0, 0);

$swatch_pixel = $tpImage->getImagePixelColor(1, 1);

$tpImage->paintTransparentImage($swatch_pixel, 0, 65535 * 0.1);

$image->SetOption('fuzz', '2%');
$result = $image->compareImages($tpImage, Imagick::METRIC_ABSOLUTEERRORMETRIC);

echo $result[0];
Run Code Online (Sandbox Code Playgroud)

目前这总是返回0 ...我不确定我是否需要使用不同的比较方法或者什么,或者如果我做错了什么,我花了很多时间在这上面和大部分资源我发现很老了.

Mar*_*ell 2

更新答案

实际上,既然您明确指出了这一点,那么当唯一的区别是透明度时,ABSOLUTE_ERROR 指标将不起作用。

要回答您的问题,您可能只想使用以下方法分离出 alpha 通道:

separateImageChannel(Imagick::CHANNEL_ALPHA);
Run Code Online (Sandbox Code Playgroud)

然后得到它的统计平均值,这将告诉您白色像素的百分比 - 即透明的。

我将在下面留下原始答案,因为这是一种有用的技术,适用于任何其他不纯粹与透明度有关的图像差异。

原答案

比较后可以得到图像属性,并在其中找到称为“失真”的元素。所以,如果我从这张图片开始:

在此输入图像描述

然后向右滚动 10 像素:

在此输入图像描述

<?php
   $image1 = new Imagick("image.png");
   $image2 = new Imagick("image.png");

   $result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR);
   $p1=$image1->getImageProperties();
   print_r($p1);
   $image1->rollImage(10,0);
   $result = $image1->compareImages($image2,Imagick::METRIC_MEANABSOLUTEERROR);
   $p1=$image1->getImageProperties();
   print_r($p1);
?>
Run Code Online (Sandbox Code Playgroud)

输出

Array
(
    [date:create] => 2016-06-02T14:15:01+01:00
    [date:modify] => 2016-06-02T14:15:01+01:00
    [distortion] => 0                            <--- Here's the little devil
    [png:bKGD] => chunk was found (see Background color, above)
    [png:cHRM] => chunk was found (see Chromaticity, above)
    [png:gAMA] => gamma=0.45454544 (See Gamma, above)
    [png:IHDR.bit-depth-orig] => 4
    [png:IHDR.bit_depth] => 4
    [png:IHDR.color-type-orig] => 3
    [png:IHDR.color_type] => 3 (Indexed)
    [png:IHDR.interlace_method] => 0 (Not interlaced)
    [png:IHDR.width,height] => 200, 200
    [png:PLTE.number_colors] => 5
    [png:sRGB] => intent=0 (Perceptual Intent)
    [png:text] => 2 tEXt/zTXt/iTXt chunks were found
    [png:tIME] => 2016-06-02T14:15:01Z
)
Array
(
    [date:create] => 2016-06-02T14:15:01+01:00
    [date:modify] => 2016-06-02T14:15:01+01:00
    [distortion] => 0.0833333                     <--- Here's the little devil
    [png:bKGD] => chunk was found (see Background color, above)
    [png:cHRM] => chunk was found (see Chromaticity, above)
    [png:gAMA] => gamma=0.45454544 (See Gamma, above)
    [png:IHDR.bit-depth-orig] => 4
    [png:IHDR.bit_depth] => 4
    [png:IHDR.color-type-orig] => 3
    [png:IHDR.color_type] => 3 (Indexed)
    [png:IHDR.interlace_method] => 0 (Not interlaced)
    [png:IHDR.width,height] => 200, 200
    [png:PLTE.number_colors] => 5
    [png:sRGB] => intent=0 (Perceptual Intent)
    [png:text] => 2 tEXt/zTXt/iTXt chunks were found
    [png:tIME] => 2016-06-02T14:15:01Z
)
Run Code Online (Sandbox Code Playgroud)