2016-06-02 7 views
5

現在、私は背景色を取得している単一の画像を持っています。私は、背景色を透明にして、それを元の画像と比較して、前記背景色からなる画像の割合を決定しようとしています。ここで私が使用しようとしていたコードは次のとおりです。PHPの画像で変更されたピクセルの割合

$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]; 

現在、これは常に0を返して...私は、私は別の比較方法または何を使用する必要があるかどうかわからないんだけど、または私は何かをやっている場合間違って、私はこれにかなりの時間を費やし、私が見つけたリソースのほとんどはかなり古いです。唯一の違いは、透明であるとき

+1

使用してみてください'$ image-> identifyFor '$ image-> compareImages()'を実行した後でメトリックを取得するためのmat( "%[distortion]") ' –

+0

私の答えはあなたの問題を整理しましたか?もしそうなら、それをあなたの答えとして受け入れることを検討してください - 投票数の横にある緑色のチェックマーク/チェックマークをクリックしてください。そうでない場合は、私が、または他の誰かがあなたをさらに助けることができるように、何がうまくいかないと言ってください。ありがとう。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

答えて

1

更新回答

は実際には、今あなたが明示的にそれを指摘していること、ABSOLUTE_ERRORメトリックは動作しません。あなたの質問に答えるために

、あなたはおそらく使用してアルファチャンネルを分離したい:

separateImageChannel(Imagick::CHANNEL_ALPHA); 

をして、白のピクセルの何パーセントを教えてくれる、その統計的な平均値を得る - すなわち透明に。

純粋に透明性に関するものではない他の画像差異化に役立つ便利なテクニックであるため、元の回答は以下のままにしておきます。

オリジナル回答

あなたは、比較後の画像のプロパティを取得し、そこに「歪み」と呼ばれる要素を見つけることができます。

enter image description here

をしてから10個のピクセル右のそれをロール::だから、私はこのイメージで起動した場合

enter image description here

<?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); 
?> 

出力

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 
) 
+0

この例は機能しますが、私の画像を比較しようとすると、私はまだ0を得ます。透明度の異なる2つの画像を比較することとは何か?色の値が変化しないので、私はアルファ値だけを信じています。 ... – Mazzy

+0

ABSOLUTE_ERRORメトリックを使用すると、透過度は無視されます。 RMSE_ERRORを試してみると透明性が考慮されると思います。すべての透明ピクセルを白にし、すべての不透明ピクセルを黒にし、イメージ平均を取得して白ピクセルの割合を決定する必要があります。 http://www.imagemagick.org/Usage/compare/にアクセスし、そのページで '56755'を検索し、そのパラグラフを読んでください。 –

+0

私は答えを更新しました。 –

関連する問題