画像編集などに使う ImageMagick を Ruby から簡単に使えるようにしてくれている Gem です。これを使って 2 枚の画像が同一かどうかを判定します。
compare
画像比較には ImageMagick の compare コマンドを使います。
compare はこんな感じで、2 枚の画像の差分を出力してくれるコマンドで、以下のように使います。
compare image1.png image2.png difference.png
image1.png
と image2.png
の差分が difference.png
として出力されます。
この際に -metric AE
をつけてあげると、差分のピクセル数を出力してくれます。
つまり、値が小さいほど似ている画像ということになります。
試しに以下の 3 枚でコマンドを実行してみます。
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.png
と sample2.png
は差分が 4989
sample1.png
と sample3.png
は差分が 0 になりました。
つまり、sample1.png
と sample3.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 スクリプトを作成しました。
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 使いやすくていいですねー