ステレオグラムの作り方_応用編2(深度マップを作る)
■好きな画像でステレオグラムを作りたい
今回はステレオグラムで3D表示させたいものを作っていきます。
基本編では白黒の円を表示させてました。ステレオグラム化のアルゴリズムを見ると灰色も判別してくれるようなので、灰色も入れた深度マップを作りたいと思います。
試しに使ってみたのがこの3パターン
8諧調のグラデーション
16諧調のグラデーション
256諧調のグラデーション
それぞれどんな見え方になるのか確認ます。
背景はまずはランダムドットノイズに設定します。
import numpy as np
import matplotlib.pyplot as plt
import cv2
def make_pattern(shape=(16,16), levels=64):
return np.random.randint(0, levels-1, shape)/ levels
pattern= make_pattern(shape=(128,64))
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")
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諧調しかないからダメなのか。。背景を写真でも作ってみましたがやっぱり滑らかな坂にはなりませんでした。
ふむ。この辺は宿題として残しておきます。(溜まる一方)
何はともあれ、諧調を変えることで飛び出し具合を変えることができることが分かりました!
次はカラー化に挑戦しようと思います。