LoginSignup
7
7

More than 5 years have passed since last update.

Imagick で画像の diff をとる(CMYK)

Last updated at Posted at 2013-03-01

RGB はどうか知りませんが、CMYK で書き出された画像の diff をとりたいと思っていろいろ調べたり、試したりしております。
下記記事もアイディアを得るのに大変参考にさせていただいたのですが、ふつうに difference をとっただけでは微細な変化をキャッチすることができません。
(画像全体を少し明るくしたなどの変化)

そこで工夫して出した結論をドキュメンテーション。

参考:
http://blog.mirakui.com/entry/20110326/1301111196

問題

コントラストや明るさを微妙に変えただけの画像比較だと、COMPOSITE_DIFFERENCE では真っ黒の画像としてしか見えない。

これは黒のコントラストをちゃんと表示できないパソコンの方に落ち度があるのかもしれないが、ほとんど視認できない。

工夫

imagick::negateImage() 関数を利用し、色を反転させると真っ黒画像よりもだいぶ見やすくなる。(真っ白の中に汚れが見えるようになる。医療とかと同じですね)
関数の説明 http://www.php.net/manual/ja/imagick.negateimage.php

さらにだめ押しで COMPOSITE_MULTIPLY オプションを利用して、自分自身と乗算させる。これにより、差が強調される。
したがって、この COMPOSITE_MULTIPLY の操作を何回かやればより微細な変化を強調して把握することが可能になる。

関数の定義部

<?php
function image_diff($path1, $path2, $path3){
    $image1 = new Imagick($path1);
    $image1->setImageColorspace(imagick::COLORSPACE_CMYK);//カラースペースをCMYKに設定
    $image2 = new Imagick($path2);
    $image2->setImageColorspace(imagick::COLORSPACE_CMYK);//同じくCMYKに設定
    $image1->compositeImage($image2, imagick::COMPOSITE_DIFFERENCE, 0, 0 );//二者の差分をとる
    $image1->negateImage(0);//差分画像の色を反転させる
    $image1->compositeImage($image1, imagick::COMPOSITE_MULTIPLY, 0, 0 );//差分画像を自乗して、変化を際立たせる
    $image1->writeImage($path3);//diff画像を書き出す
}
?>

呼び出し部

<?php
$path1 = "aaa.jpg";//比較したい画像a
$path2 = "bbb.jpg";//比較したい画像b
$path3 = "diff.jpg";//出力先の画像diff

image_diff($path1, $path2, $path3);//関数を実行する

//以下は表示部
?>

<div class="pull-left original">
    <img src="<?=$path1?>">
</div>
<div class="pull-left original">
    <img src="<?=$path2?>">
</div>
<div class="pull-left pics">
    <img src="<?=$path3?>">
</div>

7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7