視力、見る距離によって、アバターの登場人物っぽく見えたり、ヒョウのように見えたり。
ヒョウと、美女との合成イメージ(美女の画像の低周波成分を削除し、ヒョウと合成)
Hybrid-Image
MITのAude Oliva氏、Antonio Torralba氏、 Glasgow大学のPhilippe. G. Schyns氏が、
2006年に発表した論文. Hybrid imagesで、二つの画像の周波性成分を調整し、合成、
結果、見るものの視力や、距離によって見え方が異なる画像を生成することに成功しています。
論文のリンク↓
http://cvcl.mit.edu/publications/OlivaTorralb_Hybrid_Siggraph06.pdf
この論文の成果を実際に応用した結果がネット上では、下の、
アインシュタインとマリリンモンローのHibrid-Image 画像として有名
Basic idea
Hybrid-Image
http://cvcl.mit.edu/publications/OlivaTorralb_Hybrid_Siggraph06.pdf
上記の論文の冒頭をざっくり読むと、
合成の対象となる二つの画像のうち、
一つは、高周波成分を減衰させ、もう一方は低周波成分を減衰させた上で両画像を合成しているようです。
そうすることで、画像を近距離で見る場合、高周波成分が際立ち、遠距離で見る場合、低周波成分が際立つ仕組み。
How to do it ?
この論文に従うと、画像を周波数領域に変換し、それぞれ成分を調整する必要があり、
フーリエ変換し周波数成分を解析、低周波、高周波の閾値を決定、
一方の画像は、高周波成分を削除または減衰、もう一方の画像は低周波成分を削除または減衰、
その後、逆フーリエ変換で画像復元、そして両画像の合成...が、大まかな流れです。
本試行では、その手法を取らずもっと単純なアプローチで実現出来ないか?検討してみました。
非常に横着なのですが、一方の画像の低周波成分だけ削除し、
もう一方の高・低周波数成分ともに含む画像と、合成してみる簡易なアプローチを検討してみました。
便宜的に、
周波数成分未調整の画像をベース画像、
低周波成分を削除した画像をテクスチャ画像と呼ぶことにします。
Go Wavelets With Your Python !
最近、覚えたての解析手法にWavelet解析があり、今回はこの手法を使ってみます。
(当然、フーリエ変換を使っても出来ます。)
Wavelet変換は、フーリエ変換と同じく、周波数解析に利用される解析手法ですが、
根本的に異なるのは、時間情報を失わず、特定の時系列タイミングでの周波数成分を
解析することが可能なことです。
すると画像の任意のポイントを時系列とみなすことによって、任意の座標での周波数解析を行うことが出来ます。
(ただ、今回の試行では、画像の任意のポイントに着目した周波数解析を行う類のものではないです。)
また、近年、科学技術計算の分野では、これまでのMatlab、Mathmatica、Rといった数値計算アプリファミリから、
Pythonへユーザが流れているようで、Wavelet解析もパッケージ(PyWavelets)を導入することで可能です。
パッケージ PyWaveletsのサンプルデモには、image_blender.pyという今回の用途にぴったりのサンプルがあります。
こいつは、入力として二つの画像情報を受け取り、一つに合成するサンプルで、特筆すべきは、
一方の画像(テクスチャ画像)の低周波成分を削除し、高・低周波数成分を保持したままの画像(ベース画像)と合成
する機能を持っていることです。まさに今回の試行にうってつけのサンプルです。
Choosing Base/Texture Image
下の二つの画像を(左:ベース画像 puma.jpg、右:テクスチャ画像 girl.jpg)、合成しHybrid-Imageを実際に生成してみます。
利用する画像は、本ページに圧縮し、下部にリンク(archive.zip)を貼っておきます。
左:ベース画像 puma.jp、右:テクスチャ画像 girl.jp
生成コマンド
コマンドプロンプトにて、
>> python image_blender.py -l 4 -x 1.0 -y 1.8 -b ./data/puma.jpg -t ./data/girl.jpg -o chimera.jp
生成されたHibrid-Image(下:chimera.jp)
近くで見た時、遠くで見たときでアバターの登場人物っぽく見えたり、ヒョウに見えたりするハズです。
About argument
スクリプト image_blender.pyでやってることは、シンプルに
このスクリプトにテクスチャ画像として与えた、./data/girl.jpgの低周波成分を削除、
ベース画像./data/puma.jpgと合成することです。
基本ベースこれで、MITのAude Oliva氏が論文中で記述してる結果と近似できます。
ただ、このスクリプトに与える引数を調整しないと中々、望む結果を得られないのが難しいところです。
大事なオプションパラメータは、
-x:ベース画像のゲイン係数
-y:テクスチャ画像のゲイン係数
これらを試行錯誤的に調整し、トライアンドエラーで何度か繰り返す必要があり、一概にどの画像でも
利用できるパラメータ値を与えるのは難しい...。
また、与える画像のサイズの調整などもめんどくさい要素です。
実行環境
OS:Mac OS X (Yosemite ver. 10.10.2)
Python(32bit):
Python 2.7.9
Numpy 1.9.2
PIL 1.1.7
PyWavelets (http://www.pybytes.com/pywavelets)
その他の合成例
マイリーサイラス(ベース画像)とジャスティンビーバー(テクスチャ画像)の合成
左:マイリー・サイラス(ベース画像)、右:ジャスティン・ビーバー(テクスチャ画像)
見る距離によって笑い方が違ってくる
左:微笑み(ベース画像)、右:笑い(テクスチャ画像)