2D写真から立体視画像を作成してみた

スポンサーリンク

 カメラなどで撮影した写真からデプス(距離)画像を推定する技術でステレオグラムなどとも呼ばれる立体視のできる写真を作成してみました。このような画像はマジカルアイというステレオグラムを集めた本でも有名かと思います。

決定版!どんどん目が良くなるマジカル・アイ (TJ mook)
徳永 貴久
宝島社
売り上げランキング: 236,763

はじめに

 前回の記事でRGB画像からデプス画像を推定する技術を試しました。そこで気が付いたのですが、カラー画像とデプス画像があれば理屈的には立体視のできるステレオグラム画像ができるのではないかと思い、そういうソフトがないか探したところステレオフォトメーカーというものを見つけることができました。下のリンクからダウンロードできます。

 私も初めて知ったのですが、GoogleCameraでデプス付きの画像をとることのできる機能があるそうで、今回のステレオフォトメーカーはそのような画像を読み込んでステレオグラム画像を作ったりすることのできるソフトです。入力はGoogleCameraのデプス画像だけでなく、今回のようなRGB画像+デプス画像やステレオの左右画像などをサポートしています。詳細は先ほどのリンク先をご参照ください。

デプス画像作成

 前回使用したサンプルソースの出力はmatplotlibの画像が表示されるようになっています。この画像は画像サイズや色味のスケールなど余計なものが表示されており、グレースケールで距離を表したようなちゃんとしたデプス画像とは言えません。

そのため、ステレオフォトメーカーで読み込めるようなグレースケールのデプス画像を吐き出すようにする必要があります。以下のように変更しました。(修正箇所のみピックアップしています)

predict.py

import argparse
import os
import numpy as np
import tensorflow as tf
from matplotlib import pyplot as plt
from PIL import Image

import models
import cv2
import os.path

~~

    # Read image
    img = Image.open(image_path)
    w, h = img.size

~~

        # Plot result
        #fig = plt.figure()
        #ii = plt.imshow(pred[0,:,:,0], interpolation='nearest')
        #fig.colorbar(ii)
        #plt.show()

        rimg = np.asarray(pred[0,:,:,0])
        max_pix = 0
        for x in range(0, rimg.shape[0]):
                for y in range(0, rimg.shape[1]):
                        val = rimg[x,y]
                        if val>max_pix:
                                max_pix = val

        num = 255/max_pix
        rimg = rimg*num
        rimg = cv2.resize(rimg,(int(w),int(h)))
        rimg = rimg.astype(np.uint8)
        rimg = cv2.cvtColor(rimg, cv2.COLOR_GRAY2BGR)
        
        dst_path = os.path.basename(image_path)
        cv2.imwrite("depth_"+dst_path,rimg)
        
        return pred

あらかじめopencvのモジュールをインストールする必要があります。

pip install opencv-python

一つ注意すべきなのは1chのグレースケール画像形式ではなく3chのカラー画像形式(RGB/BGR)で出力しておかないとステレオフォトメーカーではうまく読み込めないということです。

ステレオグラム画像作成

 ここからがステレオフォトメーカーの出番です。ステレオフォトメーカーの「ファイル>左右の画像を開く」を選択してカラー画像とデプス画像の2枚を選択します。このときCtrlを押しながらカラー画像、デプス画像の順で開かないと最終的にうまくいきません。

そして「Alt+D」を押すと左右画像の作成に進むことができます。下画像のようなダイアログが出てきます。ここの視差を大きくすれば奥行の幅が広がります。

左右画像が完成しました。

そして保存アイコンボタンから保存すると左右画像が連結されてでてきます。

平行法で立体に見えます。まあまあの出来ですが、思ったよりちゃんと立体になってないです。

まとめ・感想

 ディープラーニングのデプス推定技術を利用してRGB画像から立体視のできるステレオグラムを作成しましたが出来はいまひとつでした。

 基本的に機械学習は教えた画像に近いものに対して結果を出してくるので、もしかしたら今回の入力画像はあまりなじみのない相性の悪いデータだったのかもしれません。そのため、学習に使われた画像をもとにそれに似ている奥行きのわかりやすそうな画像で試してみたり、大変だとは思いますがオリジナルのデータを使って学習をしてみるというのが手として考えられます。ただ、デプスに関してはデータを取るのが大変だと思います。

スポンサーリンク
Amazon

  • このエントリーをはてなブックマークに追加

関連記事

無料のDAZ Studioに課金しまくってわかったこと

はじめに  初めにお断りしておきますがこれから書く意見はあくまで素人

[最後のレストラン]ジャンヌ「出来らあっ!」

はじめに 「スーパーくいしん坊」という漫画の有名なシーンがこちら

[日本株]特定の個別銘柄の大株主一覧をネットで見る方法

 個別株を購入する際に大株主情報をネットで検索して参考にしようと思った

[DAZ Studio]目線をカメラに向ける方法

DAZ Studioでフィギュアの目線をカメラに向ける方法についてです

[TortoiseGit]ブランチ作成とマージの方法(ローカル)

 私はGitを使うときはTortoiseGitを利用しているのですが、

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。