Ruby
Gem
MiniMagick

MiniMagick を使って 2 枚の画像が同一かどうか判定する

More than 1 year has passed since last update.

MiniMagick

画像編集などに使う ImageMagick を Ruby から簡単に使えるようにしてくれている Gem です。これを使って 2 枚の画像が同一かどうかを判定します。


compare

画像比較には ImageMagick の compare コマンドを使います。

compare はこんな感じで、2 枚の画像の差分を出力してくれるコマンドで、以下のように使います。

compare image1.png image2.png difference.png

image1.pngimage2.png の差分が difference.png として出力されます。

この際に -metric AE をつけてあげると、差分のピクセル数を出力してくれます。

つまり、値が小さいほど似ている画像ということになります。

試しに以下の 3 枚でコマンドを実行してみます。

sample1.png
sample2.png
sample3.png

sample1.png
sample2.png
sample3.png

> compare -metric AE sample1.png sample2.png diff.png

=> 4989
> compare -metric AE sample1.png sample3.png diff.png
=> 0

sample1.pngsample2.png は差分が 4989

sample1.pngsample3.png は差分が 0 になりました。

つまり、sample1.pngsample3.png は同一画像です。


MiniMagick::Tool::Compare

上記の compare コマンドを使うために MiniMagick が用意してくれているインタフェースが MiniMagick::Tool::Compare です。

使い方は

compare = MiniMagick::Tool::Compare.new(whiny: false)

でまずインスタンスを作って

オプションを追加したい場合は

compare.オプション名(オプションの値)

引数を与えたい場合は

comapre << 引数

とします。

なので

compare -metric AE sample1.png sample2.png diff.png

と同じ事をしたければ

require 'mini_magick'

compare = MiniMagick::Tool::Compare.new(whiny: false)

compare.metric('AE')
compare << 'path/to/sample1.png'
compare << 'path/to/sample2.png'
compare << 'path/to/diff.jpeg'

compare.call

#=> 4989

とすれば OK です!


同一かどうか判定する

2 枚の画像の path を受け取って、同一か相違か判定する Ruby スクリプトを作成しました。


judge_same_image.rb

require 'mini_magick'

file1 = ARGV.shift
file2 = ARGV.shift

compare = MiniMagick::Tool::Compare.new(whiny: false)

compare.metric('AE')
compare << file1
compare << file2
compare << 'diff.jpeg'

compare.call do |_, dist, _|
puts dist.to_i.zero? ? '同一!!' : '相違!!'
end


実行すると

> ruby judge_same_image.rb sample1.png sample2.png

=> 相違!!

> ruby judge_same_image.rb sample1.png sample3.png
=> 同一!!

できた!!

MiniMagick 使いやすくていいですねー