蛍光灯下で撮影された画像が緑っぽくなってしまうのを補正するために、RMagickでホワイトバランスを調整する手法を実装してみました。
手法
実装がシンプルなgray worldとretinexをRMagickを使って実装してみました。
上記記事の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は蛍光灯下で撮影された画像に対しては補正が弱めで緑っぽさが若干残りましたが、加工された画像に対しても色味を変えずに補正が可能でした。
使用する画像に合わせて手法を変える必要がありそうです。