median(中央値)と呼ばれる統計量を用いて風景写真に写り込んでしまった不要な人物なんかを自動的に消してみる実験です。
Last-Modified: 2010/06/06 03:15
手法
同一シーンを撮像した複数枚の入力画像から,画素単位でR, G, Bの各要素毎にmedian (中央値)を求め,それぞれの値を出力画像の画素のRGB値とする。
結果
リスト1に示すコードを用いて,図1の5枚の入力画像を処理した結果を図2に示す。
なおリスト1で使用している画像処理ライブラリRimはhttp://github.com/zophos/Rimより入手可能である。
#!/usr/bin/ruby
#
# You can find 'rim' at http://github.com/zophos/Rim
#
require 'rim'
src=[]
Dir.glob('img00*.jpg').map{|f|
src.push(Rim.load(f))
}
r=Rim::Image.new(src[0].width,src[0].height,src.size)
b=r.dup
g=r.dup
src.each_with_index{|img,i|
r[i,true,true]=img[0,true,true]
b[i,true,true]=img[1,true,true]
g[i,true,true]=img[2,true,true]
}
dst=src[0].dup
dst[0,true,true]=r.median(0)
dst[1,true,true]=b.median(0)
dst[2,true,true]=g.median(0)
dst.save('result.png')
リスト1 実験に使用したコード

図1 入力画像

図2 出力画像
入力画像中のトトロ(灰色のぬいぐるみ)やTUX(黒っぽいぬいぐるみ)はうまく消去されているように見えるが,出力下部にはデーモン君(赤いぬいぐるみ)や緑のカエル(名称失念)などは残ってしまっている。
考察
本手法は不要物の消去にmedianを使用しているため,画像中の任意のピクセルにおいて「残したい風景」(=消去したくない物体)が入力画像群の半分以上に写っていないと,図2の緑の部分などのように機能しなくなる。
このため,人が途切れず特定の部位がほとんど見えないシーンなどでは適用が難しくなる。
また本手法は画素単位の処理のため,残したい物体が画像中の同一箇所に存在すること,撮像時の光条件があまり大きく変動しないことが前提となっている。固定されていないカメラで撮影した画像群や撮像時間が大きく異なる画像群に対し本手法を適用した場合,鑑賞に堪えないノイズが発生することが予想される。
ただし本手法は前述の条件を満たす限りにおいては対象物の色やテクスチャに依存せず非常に有効に機能し,また実装,処理も簡単に行うことが可能である。
複数の入力画像を用意できるならば,不要人物消去の一手法として他の方法に先だって試みる価値は高いと考えられる。
謝辞
この実験は「観光客が写り込んでしまった写真から美しい風景だけを取り出す方法 : ライフハッカー[日本版]」に関してのTwitterでの議論の過程においてなされた。
実験の機会を与えていただき,また結果の解釈まで広く助言を賜った@h_okumura氏,並びに手法のロバスト性についての助言を賜った@hige51nobu氏に謝意を表する。
