shobylogy

叩けシンプルの杖

RMagickで画像のホワイトバランスを調整する

蛍光灯下で撮影された画像が緑っぽくなってしまうのを補正するために、RMagickでホワイトバランスを調整する手法を実装してみました。

手法

実装がシンプルなgray worldとretinexをRMagickを使って実装してみました。

qiita.com

上記記事のcolorcorrectと元の論文を参考に実装しています。

gray worldは「画像中の全画素の平均を取るとグレーになる」という仮説を利用しており、 retinexは人間の視覚特性をモデル化しているようです。

gray world

image = ImageList.new('image.jpg')

red_mean   = image.channel_mean(Magick::RedChannel).first
green_mean = image.channel_mean(Magick::GreenChannel).first
blue_mean  = image.channel_mean(Magick::BlueChannel).first

white_balanced_image = image
white_balanced_image = balanced_image.convolve_channel(1, [green_mean / red_mean], Magick::RedChannel)
white_balanced_image = balanced_image.convolve_channel(1, [green_mean / blue_mean], Magick::BlueChannel)

retinex

image = ImageList.new('image.jpg')

red_extrema   = image.channel_extrema(Magick::RedChannel)
green_extrema = image.channel_extrema(Magick::GreenChannel)
blue_extrema  = image.channel_extrema(Magick::BlueChannel)

red_max = red_extrema.last.to_f
green_max = green_extrema.last.to_f
blue_max = blue_extrema.last.to_f

white_balanced_image = image
white_balanced_image = white_balanced_image.convolve_channel(1, [green_max / red_max], Magick::RedChannel)
white_balanced_image = white_balanced_image.convolve_channel(1, [green_max / blue_max], Magick::BlueChannel)

感想

gray worldは蛍光灯下で撮影された画像を綺麗に補正することができましたが、「全画素の平均を取ったらグレーになる」という仮説を利用しているためか、文字入れなどの加工がされた画像には弱く、そのような画像では色味が変になってしまいました。

retinexは蛍光灯下で撮影された画像に対しては補正が弱めで緑っぽさが若干残りましたが、加工された画像に対しても色味を変えずに補正が可能でした。

使用する画像に合わせて手法を変える必要がありそうです。