LoginSignup
11
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-21

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 使いやすくていいですねー

11
10
0

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
11
10