- 高さマップ(基本的に水平水平変位のマップ)の代わりに、オブジェクトは3次元座標で直接指定されます。
- オブジェクトの数と位置に制限はありません(ただし、オブジェクトが見えるように、すべてのオブジェクトが視野内にあり、ステレオグラムの平面から一定の距離にある必要があります) 1つの層。
- 作成されたステレオグラムには遠近感があります(オブザーバーから遠く離れるほど、オブジェクトは小さく見えます)。
- オブジェクトのタイプは、それが見えるビューに依存します(実際のオブジェクトに関して)。
用語
ステレオグラムとは、1つまたは複数の画像を表示したもので、ステレオ効果を生み出します(観察者は画像の奥行きを感じます)。 ステレオグラムには、たとえば、アナグリフ画像やオートステレオグラムが含まれます。 オートステレオグラムは、単一の画像で構成されるステレオグラムであり、表示用の追加のデバイス(アナグリフグラスやステレオスコープなど)は必要ありません。 この記事では、オートステレオグラムについて検討します。
アルゴリズムの本質
タスクは、このような画像を平面上に作成し、それを見ると、両眼がこの画像の代わりに実際の3次元オブジェクトを観察する場合と同じように見えるようにします(図1)。

図 1。
観測者の目が1つだけであると仮定すると(点を考慮します)、タスクは平面上の3次元オブジェクトの中心投影に縮小されます(オブジェクトの点の中心投影は、オブジェクトの直接点と視点-線と平面の交点を接続することで取得できます)中心投影;目の点は投影中心と呼ばれます)。 しかし、オブジェクトの両方の投影を並置する必要があるため、観測者には2つの目があります。
3次元オブジェクトのポイントT 1を考えます(図2)。 このポイントは、オブジェクトの可視部分にあります。 左目用の平面上のこの点の射影は、右-P 2の場合、P 1になります。 左目用の点T 1の可視位置は、平面上の点P 1の可視位置、および右眼用の点P 2の位置と一致するため、点P 1およびP 2は、物体点T 1の色と一致する同じ色でなければなりません。視覚システムが右目と左目からの画像に正しく一致するようにします。 次に、左目への投影が点P 2と一致するように、オブジェクト上で左目に最も近い点を見つけます。 これがポイントT 2になります。 ポイントP 3は、右目でのT 2の投影であり、P 1およびP 2と同じ色でペイントする必要があります。

図 2。
点P 1 、P 2 、P 3 ...のシーケンスを取得するプロセスは、条件の1つが満たされるまで繰り返されます。
- 平面上のオブジェクトの次のポイントの右目の投影は、作成されたイメージの境界の外側にあります(無限サイズのステレオグラムを作成しない場合)。
- オブジェクトT kの次の点は右目では見えません。 目に近いポイントがあり、右目用のポイントの投影が一致します。
- 右目の次の投影点P jの場合、左目の投影がP jと一致するオブジェクト上の点はありません(通常、この状況は不可能です-背景として機能し、視野全体を占める平面または他の図形がオブジェクトの背後に作成されます)。
実際、アルゴリズムは、ステレオグラムをそのようなポイントのグループに分割し、各グループに特定の色を選択することから成ります(グループのすべてのポイントは同じ色でなければならないため、このようなグループを1色と呼びます)。
目はステレオグラムの平面から同じ高さにあり、同じ距離にあると考えています。 その結果、両方の目から発せられ、投影面の水平線を通過する光線は同じ平面にあります。 異なる水平線を通過する光線は、目を結ぶ直線で交差する異なる平面にあります。 したがって、1つのモノクロームグループのすべてのポイントP 1 ... P Nは、 1つの水平線上に配置されます。
ステレオグラムの平面を超えて配置されたオブジェクトを調べました。 平面の前にあるオブジェクトの場合、画像を構築する方法は似ています。 唯一の違いは、平面の後ろにあるオブジェクトの場合、次の投影点P j + 1がP jよりも右側にある場合、平面の前にあるオブジェクトの場合、点P j + 1は、反対に点P jの左にあることです。 ステレオグラムの平面の両側にあるオブジェクトを含むステレオグラムを作成できますが、いくつかのニュアンスを考慮することが重要です。 このようなステレオグラムのシーケンスP 1 ... P Nの次の各ポイントは、前のものの右または左のいずれかになります。 したがって、サイクルの形成が可能です。 もう1つの結果は、1つのモノクロームグループがかなり多数のポイントを含むことができ、ステレオグラムの外観を損ない、その表示を複雑にする可能性があることです。 一般に、ステレオグラムの平面の両側にあるオブジェクトを同時に観察することは不可能です。平面の後ろのビューに焦点を合わせると、平面の前のオブジェクトも平面の後ろに見えますが、奥行きが逆になります。 飛行機の前で焦点を合わせると、同様の問題が発生します。
実装の詳細
ステレオグラムは、3次元空間の平面上の長方形で、長方形のピクセルのグリッドに分割されています。 便宜上、すべての方向にピクセルグリッドを続けて、ステレオグラムの平面全体で埋めます。 タスクを少し簡単にしましょう-目の前にある空間内の点のみを考慮します(目から描かれた光線がステレオグラムの平面と交差する点)。 ステレオグラムの平面上の任意の点の中心投影は、ピクセルの1つに分類されます。 また、2つの目があるため、空間内の各ピクセルは2つのピクセルに対応し、左目と右目の点の投影を含みます。 ピクセルの特定のペアが対応するポイントのセットは、クラスターと呼ばれます(実際、このようなクラスターは、目から出て対応するピクセルによって引き寄せられる2つの立体角の交差点です)。 クラスターの角度寸法は、クラスターが見えるピクセルの角度寸法に等しくなります(図3を参照)。

図 3. T1とT2はクラスター、P1、P2、およびP3はピクセルです。
アルゴリズムは次のとおりです。各ピクセルには、指定されたピクセルに投影されるオブジェクトのポイント(つまり、このピクセルを通して見えるポイントが取得されます)の中で(目に対して)最も近いポイントがあります。 これは、目から出て各ピクセルを図形で通過する光線(ポリゴンや球のような単純な形状に適しています)を横切るか、座標グリッドのポイントで表面関数の値を計算することにより行われます。 詳細は、アルゴリズムのソースコードを調べることで確認できます(記事の最後にあるリンクを参照)。 この手順は、目ごとに順番に実行されます。 さらに、見つかった最も近いポイントまでの距離は、セグメント長またはZ座標の形式ではなく、クラスター座標の形式で保存されます。 また、クラスターは2つのピクセルの座標で指定されるため、特定のピクセルについて、クラスターのもう一方の目への投影であるピクセルの座標を格納するだけで十分です(さらに、目からクラスターまでの距離を比較するには、別のピクセルの座標を比較するだけで十分です)。 したがって、各ピクセルに対して、2つのクラスターに対応する他の2つのピクセルの座標のみを格納します。
図の例で述べたことを説明しましょう。 3.左目に対して共通の投影P 1を持つクラスターT 1およびT 2を考えます。 右目に対する投影は、それぞれP 3とP 2です。 ただし、P 2はP 3の左側にあります。 したがって、クラスターT 2は T 1よりも左目に近いです。
クラスターを使用すると、モノクロのポイントグループを簡単に取得できるため、便利です。 明確にするために、再び図に戻ります。 3. P 1の場合、左眼に最も近いクラスターの座標はペア(P 1 、P 2 )として指定されます。 P 2の場合、右眼に最も近いクラスターの座標も(P 1 、P 2 )です。 これは、ピクセルP 1とP 2を通る目が共通のクラスターを見るため、ピクセルP 1とP 2は同じモノクロームグループに属していることを意味します。 P 3の場合、右目用の最も近いクラスターの座標は(P 1 、P 3 )であり、P 1の左目用の最も近いクラスターの座標とは一致しません。 つまり クラスター(P 1 、P 3 )はより近いクラスターによって左目から見えなくなり、ピクセルP 1とP 3は異なる同色グループに属します(ピクセルP 3はそのグループの最後です)。 1つのピクセルは各目に対して1つ以下のクラスターに対応し、1つのクラスターは各目に対して1つ以下のピクセルに対応します。これにより、モノクロームグループに分割するアルゴリズムが非常に簡単になります。
モノクログループの色を選択することは残っています。 これらは、ランダムに選択するか、背景画像に基づいて選択できます(さらに、背景画像に繰り返し部分を含める必要はありません)。 説明したアルゴリズムでは、両方のオプションが実装されています(ソースを参照)。
次に、アルゴリズムの結果を見てみましょう(図4)。 このステレオグラムには、いくつかの球体と、ステレオグラムの平面に平行な平面が背景として表示されます。 ピクセルの色はランダムに生成されます。

図4 クリックで-解像度1024x768のステレオグラム。
球体をよく見ると、球体がステレオグラムに平行な平面で構成されているかのように、球体のステップに気付くことができます。 ステレオグラムの繰り返し部分間の距離は、オブジェクトの深さを設定します(距離が大きいほど、オブジェクトは遠くに見えます)。 1ピクセルのみの距離の違いは、すでに深さの顕著な違いを示しています。 この問題は、デバイスの解像度を上げるか、アルゴリズムを変更することで解決できます。 2番目の方法に進みます。 これを行うには、仮想ピクセルの幅を数倍減らし、水平ピクセルの数を同じ量だけ増やします。 次に、画像を生成するときに、いくつかのサブピクセルを1つのピクセルに結合します(サブピクセルの色の算術平均をピクセルの色として使用します)。 図 図5は、もうステップがないことを示しています(画像の繰り返し部分のステップはピクセルの1/3の倍数であるため、ここではピクセルごとに3つのサブピクセルが使用されます)。

図 5.クリック-解像度1024x768のステレオグラム。
図 図6は、高さマップ画像の例を示しています。 そして図 図7は、この高さマップに基づいて作成されたオブジェクトを含むステレオグラムを示しています。 高さマップは、座標がピクセルとその色の座標に基づいて設定される空間内のポイントのセットと見なされます。 隣接するポイントを接続する三角形が作成され(詳細についてはソースを参照)、オブジェクトがポイントのセットではなくソリッドに見えるようにします。 任意の基準を使用して、オブジェクトを歪ませて回転させることができます(ポイントの座標はV 1 * x + V 2 * y + V 3 * zとして計算されます。ここで、xおよびyは高さマップ上のピクセルの座標、zはその色、V 1 、V 2 、V 3が基本です)。 以前のステレオグラムとは異なり、ここでは色は特定の背景画像に基づいて撮影されます。

図 6.元の解像度の画像をクリックしてクリックします。

図 7.クリック-解像度1024x768のステレオグラム。
参照資料
- en.wikipedia.org/wiki/Autostereogram-オートステレオグラムに関する一般情報。
- github.com/Domanser/AutoStereogramDemo-記述されたアルゴリズム(C#4.0)のソースコード、およびこの記事などで提供されるステレオグラムの作成例。