【Ruby】rmagickを使用して画像比較結果を生成するのにcompare_channelを使う

経緯

画像を比較して差分があった場合に比較結果画像を生成したいのだけれど、compositeで画像合成すると結果画像としては見辛かったので何か良い方法がないかと探した話です。

環境

ruby 2.4.2
rmagick 2.16.0

画像比較処理を作る

まずは、下記を参考に画像比較の処理を組みました。

rmagick(ImageMagick)を使って画像の差分を取得する

そもそもcompositeってどんな合成方法があるの?

rmagick 2.12版のリファレンスなので少し古いですがGuideを見てみました。

#composite

Exampleがとてもわかりやすいです。
要は、引数に渡すCompositeOperatorで合成方法が色々と変えられるということです。
Exampleに書いてある単語で検索していれば該当の定数は見つかります。

require 'rmagick'

a = Magick::Image.read('./a.png').first
b = Magick::Image.read('./b.png').first

a.composite(b, Magick::NorthWestGravity, Magick::DifferenceCompositeOp).write('./c.png').destroy!
a.composite(b, Magick::NorthWestGravity, Magick::AddCompositeOp).write('./d.png').destroy!

でも、個人的には差分比較の結果としてみるには見辛かった…。

compare_channelってメソッドがあった

#compare_channel

Descriptionを読む感じ、compositeが画像の合成なのに対し、compare_channelは画像の比較のようなので、これを使ってみることにしました。

compare_channelの戻り値は[image, float]なので、imageの方を取り出して保存します。

a.compare_channel(b, Magick::MeanSquaredErrorMetric)[0].write("c.png").destroy!

ChannelTypeもいろいろあるようなので、試してみて比較する画像に合わせてメソッドの使い分けするのが良さそうです。

参考

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.