ITANDI TECH BLOG

イタンジのスタッフブログです。イベントや技術情報などを発信しています。

同じ画像を判定するrubyスクリプト

こんにちわ、エンジニアのマイケルです

物件画像が重複することがよくあるのでrubyで判定するスクリプトを作成しました。

判定方法

ImageMagickを使います、具体的にはここに書かれていることをrubyからやります。 2枚の画像のdiff(差分)を超簡単に調べる方法

下準備

# ImageMagickをインストールします
brew install imagemagick

# rmagickをインストールします
gem install rmagick

コーディング

require "rmagick"
def same_image?(image1_path, image2_path)
  # 画像pathはlocalのパスやurlを指定
  image1 = Magick::Image.read(image1_path).first
  image2 = Magick::Image.read(image2_path).first

  # 縮小しサイズを合わせます
  small_image1 = image1.resize_to_fit(100)
  small_image2 = image2.resize_to_fit(100)

  diff = small_image1.composite(small_image2, 0, 0, Magick::DifferenceCompositeOp)
  # 全く同じ画像の場合0になります
  diff.channel_mean.first.to_i <= 3500
end

今回縮小してchannel_meanの判定を3500にしているのは、同じ画像のサイズ違いや画質違いでも同じ画像と判定するためです。(ここの数値に関しては用途に応じて調整してください)

サイズ含めて全く同じ画像か判定したい場合はこんな感じですかね。

require "rmagick"
def same_image?(image1_path, image2_path)
  image1 = Magick::Image.read(image1_path).first
  image2 = Magick::Image.read(image2_path).first

  # composite前にサイズ違いを除外
  unless image1.rows == image2.rows && image1.columns == image2.columns
    return false
  end

  diff = small_image1.composite(small_image2, 0, 0, Magick::DifferenceCompositeOp)
  diff.channel_mean.first.to_i == 0
end

まとめ

いかがだったでしょうか。個人的には思っていたより簡単にできてしまうことに少し驚きました。imagemagickといえば画像加工(主にサムネイル生成)というイメージでしたが、画像重ねる事でdiffも取れるとは。この機会にimagemagickのドキュメントちゃんと読んでみようと思って開いてみたけど、、やっぱやめた imagemagickドキュメント

イタンジ株式会社ではエンジニアを募集しています

募集しています!一緒に開発しましょう!

不動産業界を怠惰・短気・傲慢な気持を持って徹底的に革新するエンジニア募集! - イタンジ株式会社の新卒・インターンシップ - Wantedly