こんにちわ、エンジニアのマイケルです
物件画像が重複することがよくあるので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