web-dev-qa-db-ja.com

ImageMagickを使用して画像を「差分」する

2つの画像の違いを取得するにはどうすればよいですか?元の画像があります。誰かが元の画像の正確な複製に書いた。今、私はオリジナルを書かれたイメージと比較し、イメージ形式で書かれたものだけを抽出する必要があります。

例:家の写真があります。誰かがコピーを取り、コピーに「Hello!」と書きました。どういうわけか、2つの写真を比較し、家を取り除き、「こんにちは!」という言葉の画像を残したいと思います。

これはImageMagickで可能ですか?画像間の統計的な違いを取得する方法があることは知っていますが、それは私が探しているものではありません。

155
Justin Noel

私のお気に入りは次の2つです。

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

上記の2つのコマンドの唯一の違い:最初のコマンドは2つの画像の視覚的な違いをPNGファイルとして表示し、2番目のコマンドはPDFとして表示します。

結果の差分ファイルには、赤色の異なるすべてのピクセルが表示されます。変更されていないものは白く表示されます。

短くて甘い。

画像にはnotと同じタイプが必要です。 JPEG、TIFF、PNGを混在させることもできます-1つの条件の下で:画像は同じサイズ(ピクセル単位の画像サイズ)でなければなりません。出力形式は、出力ファイル名の拡張子によって決まります。

何らかの理由でデフォルトよりも高い解像度(72 dpi)が必要な場合は、適切な-densityパラメーターを追加するだけです。

 compare -density 300 image1 image2 -compose src diff.jpeg

図解された例

上記のコマンドのバリエーションの結果の図をいくつか示します。 注:比較される2つのファイルは偶数でしたPDFファイルですので、これらでも動作します( 1ページャーである限り)!


左:テキスト付き画像中央:元の画像右:赤ピクセルの差(=テキスト)。 Red difference pixels only; identical pixels are white

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

これは、前に提案した同じコマンドです。


左:テキスト付きの画像中央:元の画像右:「seagreen」ピクセルの違い。 Seagreen difference pixels only; identical pixels are white

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

このコマンドは、デフォルトの赤ではなく、差のピクセルを「seagreen」にするためのパラメーターを追加します。


左:テキスト付きの画像中央:元の画像右:青の差分(ただし、コンテキストの背景付き) Blue difference pixels only; first of the compared images as a lightened-up backgroundl

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

このコマンドは、-compose src部分を削除します。結果は、compareのデフォルトの動作であり、2つの差分画像の最初の画像を明るい背景として保持します。 (今回は、差分ピクセルを青で表示するためのパラメーターが追加されています。)

298
Kurt Pfeifle

compareは多くのアプリケーションで良い仕事をしますが、特にグレースケールの画像を比較する場合は特に、異なるアプローチを好むことがあります。

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

アイデアは次のとおりです。file1.pngfile2.pngの両方をグレースケールに変換します。次に、最初の画像を結果の画像の赤チャネル、2番目の画像を緑チャネルとして追跡します。青チャネルは、これらの2つからdarken構成演算子を使用して形成されます。これは、基本的に最小値を取ることを意味します。

したがって、両方の画像で白いものは白いままです。両方の画像で黒いものは黒いままです。最初の画像では白く、2番目の画像では黒であるものが赤に変わり、2番目では白であるが最初の黒であるものは緑になります。

その結果、きれいに色分けされた画像が得られ、緑を最初の入力に、赤を2番目の入力に簡単に関連付けることができます。 LaTeXの出力を KaTeX (これを改善するために バグを修正する の前)と比較するためにこれを使用している例は次のとおりです。

enter image description here

アプローチを組み合わせて、compareを使用してwhere何かが変更されたことを確認し、上記を使用して詳細を確認できますhow変更しました。

49
MvG