ステレオグラムの作り方_基本編1(背景画像を作る)
最近、目が悪くなったと感じています。どうもピント調節機能が落ちているみたい。
そこで、ピント調節をする筋肉の『毛様体筋』の筋トレに使えるステレオグラム画像を作ろうと思い立ちました。(↓こういう画像)
ステレオグラム画像を立体視しようとすると、何度もピント調節を繰り返すので毛様体筋の筋トレになるそうなのです。
画像を作るのにはPythonを使います。Pythonは少し前に勉強を始めた言語で、それ以外の言語は一切使ったことがありません。技術レベルは初心者と表現するのもおこがましい状態です。
スマートに作れる気がしませんが、試行錯誤や足掻いた履歴など完成までの過程を残していきたいと思います。
■まずは何かを作ってみよう
”Python,ステレオグラム”のキーワードで検索してみると、下記の方のサイトがまず出てきました。ふむふむ。これはありがたい。
Pythonでオリジナルのランダムドットステレオグラム(RDS)を作る。 - Qiita
Making Your Own Autostereograms using Python | Frolian's blog (flothesof.github.io)
こちらを参考に作ってみたいと思います。
詳細理解できていませんが、ざっくりと以下の手順で作っていくようです。
<ステレオグラム作り方>
①背景画像を作る(とても小さいサイズで)
②3Dで見せたい画像(深度マップ)を作る
③背景画像を深度マップの画像サイズに合うように並べていく
※この際、深度マップの画像情報に合わせて背景画像をずらす&密度を変える
それでは、順番に取り組んでいきましょう。
①背景画像を作る
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))
plt.imshow(pattern, cmap='gray')
もう一つ気になっているのは1行目の「levels=64」。np.random.radientの最大値の引数に使われています。
np.random.radient(0, levels-1 , shape)/levels
乱数の最大値-1が実際の最大値ということなので、64-1-1=62が実際の最大値になるのかな?
0~62の間でランダムに値を出してから、それを64で割っていますが、なぜこの方法をしているのか分からないのです。
という訳で、試しに値を色々と振ってみました。
<乱数の最大値を1にして、割ることをしない場合>
真っ黒になりました。
乱数の最大値-1なのでランダムに出される値は1-1=0で、”0”しか選択肢がないので真っ黒になるのは想像通りの動作です。
<乱数の最大値を2にして、割ることをしない場合>
こちらは白と黒の2値ですね。
乱数の最大値-1なのでランダムに出される値は2-1=1で、ランダムに出される値は”0”か”1”しか選択肢がないのでこちらも想像通りの動作です。
<乱数の最大値を256にして、割ることをしない場合>