2011/09/14

OpenCV で Tilt Shift もどき

ある日突然、「3年生の向けの『画像情報処理』の演習課題を作ってほしい」と言われました。なんじゃそりゃ。

軽く考えていたものの、いざ作り始めてみると意外なほど制約が多い事に気付きました。

まず、この学校ではなぜか C++ のカリキュラムが存在しないため、サンプルコードもオブジェクト指向を極力避ける形になります。加えて、3年生は JABEE の関係上、非常に過酷な実験科目が別途課されているため、あんまり追いつめるわけにもいきません。

そんなこんなで、ひとまず「Gaussian フィルタによる画像平滑化を利用した Tilt Shift 画像の生成」と題して、デジカメで撮った写真をファンタジックに加工する処理でも実装して頂こうかと考えています。なんじゃそりゃ。



Tilt Shift で画像検索すると、風景がまるでジオラマのように写っている写真が多く見られます。この効果を狙って、Tilt Shift レンズが装着されているカメラも存在します(4月25日の日記参照)。

本来は、アオリ撮影を応用して被写界深度を狭めるテクニックなのですが、通常の画像でも簡単な画像処理を施す事によってその効果を疑似的に再現する事が可能です。

今回、試作したプログラムで写真を加工した結果はこんな感じになりました。

【Before】
【After】

上下にぼかしが加わっているのがお判りいただけますでしょうか。

彩度やコントラストを強調したり、構図を工夫したりすれば、よりジオラマのような質感が得られますが、今回は簡単のため省略。



作り方のアイディアは、以下の通り。

1) まず、元の画像を用意します。

2) Gaussian フィルタによって、原画像を平滑化します

3) 合成用のマスクを用意します。

4) マスク画像を利用して、1) と 2) を合成します。

たったこれだけです。

特筆すべきは、3) のマスク画像のグラデーションも、Gaussian フィルタで作成可能という点。このおかげで、ソースコードはかなり簡潔になると思います。

それでも、3年生が習熟しているのはあくまで1次元的な信号処理システムですから、対象が画像という2次元離散信号に変われば、改めて考察の余地が生ずるのではないでしょうか。



【もうひとつのアイディア】

ここまで書いておいてなんですが、Tilt Shift 画像の生成はどちらかというとお遊びに近い課題ですので、もう少し学術的要素を盛り込んだ演習テーマも密かに考えています。

Hadamard 変換や離散 cos 変換の基底を合成して、任意の(グレースケール)画像を生成し、「なぜ任意の入力信号を直交関数系(ここでは基底画像)の合成で近似できるのか」をボトムアップ的に再考察させるというものです。割と定番なネタかも知れませんが。

ここでの狙いは、画像という身近で視覚化しやすい題材を用いる分、2年次の Fourier 変換で躓いた学生が『なるほど!』をゲットするいい機会だと思うのです。余計なお世話かな……。

1 件のコメント:

  1. opencv仮免中2012年4月26日 19:39

    グラデーションのマスクを使用するとsmooth関数の使用回数が減りますね!
    早速試してみたのですが、うまくいかない。。

    >4) マスク画像を利用して、1) と 2) を合成します。
    これって
    cvCopy (オリジナル画像, smooth画像, mask);
    のイメージでで合っていますか?
    そもそもcvCopyではない?

    素人でごめんなさい。気になって気になって。。
    しらべたけれどわからない。。

    返信削除

ひとことどうぞφ(・ω・,,)