大きくなったら大蛇に

Python始めたての初心者による学習ブログです

ステレオグラムの作り方_応用編2(深度マップを作る)

■好きな画像でステレオグラムを作りたい

今回はステレオグラムで3D表示させたいものを作っていきます。

基本編では白黒の円を表示させてました。ステレオグラム化のアルゴリズムを見ると灰色も判別してくれるようなので、灰色も入れた深度マップを作りたいと思います。

 

試しに使ってみたのがこの3パターン

 8諧調のグラデーション

 16諧調のグラデーション

 256諧調のグラデーション

それぞれどんな見え方になるのか確認ます。

背景はまずはランダムドットノイズに設定します。

In[1] #インポートするライブラリ

import numpy as np
import matplotlib.pyplot as plt
import cv2

In[2] #ランダムドットノイズの背景の元を作成

def make_pattern(shape=(16,16), levels=64):
       return np.random.randint(0, levels-1, shape)/ levels
pattern= make_pattern(shape=(128,64)) 

 
次に本題の深度マップを作成。
深度マップはラスター画像(普通のお絵かき画像)で作ります。
ベクター画像と呼ばれる数式で作られた画像の方がノイズがないのでキレイに作れそうですが、数式では複雑な画像を作れないので。
お絵かき作成ツールはWindows標準アプリのペイントとフリーソフトGIMPを使いました。GIMP…あんまり使ったことがなかったので苦戦しました。
In[3] #深度マップを作成

depth_grad = cv2.imread('画像のPath/ファイル名.png')
depth_grad = cv2.cvtColor(depth_grad, cv2.COLOR_BGR2GRAY)
 
def make_depthmap(shape=(400, 600)): 
      depthmap = np.zeros(shape, dtype=np.float64)
      depthmap = depthmap+depth_grad 
      return depthmap 
 
depthmap = make_depthmap() 
plt.imshow(depthmap, cmap="gray")

画像ができたらcv2.imreadで画像を読み込みます。読み込んだらグレースケールに変換。
この画像とは別で”np.zeros”で400×600サイズの真っ黒な画像を作っておいて、これを土台にして読み込んだ画像(背景は透明にしてあります)を上に重ねて深度マップの完成です。
後から思いましたが普通に黒背景で作れば早かった。

In[4] #正規化

def normalize(depthmap):
        return depthmap/255

def make_autostereogram(depthmap, pattern, shift_amplitude=0.1, invert=False):
    depthmap = normalize(depthmap)
 
    if invert: 
        depthmap = 1 - depthmap
    autostereogram = np.zeros_like(depthmap, dtype=pattern.dtype)
 
    for r in np.arange(autostereogram.shape[0]):
 
        for c in np.arange(autostereogram.shape[1]):
            if c < pattern.shape[1]:
                autostereogram[r, c] = pattern[r % pattern.shape[0], c]
            else:
                shift = int(depthmap[r, c] * shift_amplitude * pattern.shape[1])
                autostereogram[r, c] = autostereogram[r, c - pattern.shape[1] + shift]
 
    return autostereogram
 
autostereogram = make_autostereogram(depthmap, pattern, 0.3)
plt.imshow(autostereogram, cmap='gray')

 

できました!

おお!諧調ごとに飛び出し具合が違いますね。

 

おや?

入力した深度マップは上から

 8段階

 16段階

 256段階

の諧調があるので、上から

 8段の階段

 16段の階段

 滑らかな坂

に見えるのかと予想していましたが、一番下、20段数段しか階段できていませんね。

計算してみたら丸められていたりするんでしょうか。

背景のパターンを128×64サイズで作っているから限界があるのか。背景のランダムドットノイズがそもそも64諧調しかないからダメなのか。。背景を写真でも作ってみましたがやっぱり滑らかな坂にはなりませんでした。

ふむ。この辺は宿題として残しておきます。(溜まる一方)

 

何はともあれ、諧調を変えることで飛び出し具合を変えることができることが分かりました!

 

次はカラー化に挑戦しようと思います。