imagemagickで画像重ね合わせ比較してみた際の備忘録

imagemagickで画像比較をしてみる

仕事で受け取るドキュメントの修正箇所を目視で確認するのが面倒だったので、一回PDFにして変更前後で重ね合わせて修正点を確認する方法がないかなーと思ってimagemagickのconvertでやってみた際の備忘録。
※CentOS7上で実施した。

シェルなりpowershellなりで、convertでpdfバラした後のファイルのページ番号切り出してループ回すくらいは出来るよね?前提で書いているので、その辺は頑張って書いてくださいね!

どんな結果になるかはこちらのサイト様を見てもらうとイメージしやすい

PDFを画像に変換する際のリソースを制限する

※ghostscriptが必要なので忘れずにインストール
convertコマンドでpdfの各ページをjpgなりpngなりにすればいいのだが、制限かけてないとメモリリソースと/tmp領域食いつぶす勢いで消費するので若干危険。

/tmpではなく、容量が豊富な領域を指定するために環境変数「MAGICK_TEMPORARY_PATH」で適当なパスを指定してそこを一時領域として使う。
メモリの制限は 、convertコマンドのオプションで「-limit memory 512MiB -limit map 512MiB」のように上限を設定しておく。

下記のような感じで実行すると、diff1-[ページ番号].jpgみたいな感じでファイルが作成される。
convert -quantity 100 -limit memory 512MiB -limit map 512MiB -density 100 <PDFファイル> diff1.jpg

変更有り無しのチェック

ばらしたpdfの各ページを
composit -compose difference <画像1> <画像2> <比較結果画像>
という感じで比較した結果を生成する。
上記コマンドで完全一致している場合は真っ黒な画像になるので、真っ黒かどうかを以下のコマンドで確認する。
identify -format "%[mean]" <比較結果画像>

上記コマンドの戻り値が0でない場合は何らかの差分がある状態。
ただ、画像のモアレみたいな微妙な差でも0にならないことが多いので、0じゃなかったら赤青画像を重ね合わせて差分が分かる画像を生成する。

赤青画像の生成、重ね合わせ

赤い画像と青い画像を作成して、それを重ね合わせた画像を生成する。これでどこが変わっているかが見てわかるようになる。
・赤い画像の生成
convert -type GrayScale +level-colors Red,White <元画像> <赤画像>
・青い画像の生成
convert -type GrayScale +level-colors Blue,White <元画像> <青画像>
・赤青画像の合成
convert -compose Multiply -composite <赤画像> <青画像> <重ね合わせた画像>

やってみての感想

ページがずれたりした場合は変更前のpdfに白紙ページを挿入して調節したりする必要はあるが、Excelでテキストボックスで書いてる個所など、単純なDiffツールで拾えない部分の修正チェックをしたい場合には使えるかなという感じ。チェックの証跡としても残せるのでいいかな?

200ページくらいあるpdfだと割と時間がかかるので、並行で他のタスクをこなしたり優雅にコーヒーを飲めばいいと思うよ

imagemagickはフリーで使えるツールなので、コストもかからずいい感じ。

ただ、Windowsでやろうと思ったらクソSymantecがconvert.exe実行の都度セキュリティの警告を上げてきて大変うざかったのでLinuxのシェルで回すことにした経緯がある。
imagemagickの古いバージョンはOKで、逆に最新だと引っかかるのが謎。
これが無かったらpowershellで作ったツールを周りに展開できたんだけどなぁ。
皆、Linux使ってくれないんだよなぁ…。

コメント

このブログの人気の投稿

ヤマダ電機の安心会員住所変更をした

JP1の定義をドキュメント化するjp1ajs2.jobdocが超便利

curlでADのドメインユーザーでプロキシを超える