情報のホログラフィック符号化および復号化の実験

ホログラフィックの原理に基づいて、何らかの方法で情報をエンコードしたかったのです。 私はそのようなものだけでなく、私のアイデアや理論のいくつかをテストしたかったのです。 理論は確認されず、アイデアは実現されませんでした。 しかし、私はそのようなアルゴリズムをゼロから見つけられず、物理学の教科書に基づいて自分で発明しなければならなかったので、Habrでそれを共有することにしました。 ところで、アルゴリズムは非常に簡単です。



それでは始めましょう。

ホログラムはどのように作成されますか? 一般に、 コヒーレント光源からの光線は、 何らかの方法で2つの部分に分割され、その1つは写真プレートに直接当たり、もう1つの部分も写真プレートに当たりますが、ホログラムを受信したいオブジェクトから反射した後です。 その結果、光源から直接来る光と対象物から反射される光の干渉の写真が写真プレートに記録されます。

ホログラフィの本質は、干渉パターンでは、オブジェクトの1つまたは別のポイントの輝度だけでなく、このポイントまでの距離もエンコードされることです。 これは、光波がさまざまな位相で写真プレートに到達するために発生し(位相は物体のポイントまでの距離に依存します)、これらの波は位相に従って加算され、実際には干渉パターンが形成されます。



物体の画像は、現像された写真プレートに同じ波長の光を照射するだけで復元されます。 白色のインコヒーレント光によって復元されたホログラムがありますが、それらは考慮していません。



ホログラムには興味深い特性があります。

たとえば、任意のホログラフィック画像を使用して、オブジェクトの完全な画像を復元できます(画質が低下します)。

異なる波長の光源を使用して、複数のオブジェクトの画像を1つの写真プレートに記録することができます。 そして、目的のオブジェクトを記録するために使用されたのと同じ波長の光で写真プレートを照らすことにより、各オブジェクトの画像を個別に復元します。



実際、この方法でサウンドファイルをエンコードしたかったため、ホログラフィックコーディングのアイデアが思い浮かびました。 このようなファイルの任意の部分を切り取り、元のサウンドを(最悪の品質で)完全に再現することが可能です。 1つのファイルに複数のサウンドを録音することが可能で、ファイルのどの部分にもこれらのサウンドが含まれており、個別に再生できます。



なぜこの考えが実現されなかったのですか?

まず、音は絵ではなく、すぐに完全に絵を見て、おなじみの詳細を自動的に強調します。 そして、私たちは音を順番に聞きますが、ノイズは知覚に大きく影響します。 さらに、ホログラフィックコーディング中、ノイズはホイッスル、シューという音などの形で表示され、元の音に重畳されます。

第二に、アルゴリズムの複雑さをすぐに考慮しませんでした。 アルゴリズムの複雑さはO(n ^ 2)と推定されます。 つまり 1メガバイトのファイルをエンコード(およびデコード)するには、1兆(100万)の反復が必要であり、各反復も実行する必要があります。たとえば、10キロバイトのWAVファイル(2〜3秒のサウンド)が約1分間エンコードされました(10,000 * 10,000反復= 1億反復)。 そして、アルゴリズムを高速化することは機能しません。 また、ファイルを10倍にエンコードするには、100倍の時間が必要です。

そして第三に、通常のホログラフィック画像を取得するためには、対象物は対照的でなければなりません。 そして、サウンドファイルのコントラストは何ですか? ほぼランダムな数字のセット。



しかし、アルゴリズム自体とその動作デモに戻ります。

エンコードとデコードは同じアルゴリズムで実行されますが、デコードすると係数のペアが変わります。

「高速」であるため、テスト画像処理アルゴリズムはPHPに実装されました(WAVファイルの実験にはC言語が使用されました)。



最初:元の画像のピクセルの明るさのマトリックス(エンコードまたはデコードには、2500 * 2500 =約600万回の反復が必要です。私の場合-PHPの数秒)

$ data0 [50] [50];



出力:「写真プレート上の」ピクセル輝度マトリックス

$ data1 [50] [50];



$W=0.1; //



//

for($x1=0;$x1<50;$x1++)

for($y1=0;$y1<50;$y1++) {



// - ,

256 , , (128 ).

$px=128.0; // , (.. =0 )



// -

for($x0=0;$x0<50;$x0++)

for($y0=0;$y0<50;$y0++) {



// (x0;y0) (x1;y1) z=1,

$D=sqrt(1+($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1));



//

$Phase=$D/$W;



// ( 0.3 - )

$obj_light=($data[$x0][$y0])*0.3;



// ( )

$px+=$obj_light*cos($Phase);



}

// , .

$px=abs($px);



// - (x1;y1)

data1[$x1][$y1]=$px;

}









この行の係数は$ obj_light =($ data [$ x0] [$ y0])* 0.3; 拾います。 そのための式を導き出すことは可能ですが、真実はエンコードの場合とデコードの場合で別々です。



デコードは同じアルゴリズムで実行され、$ px = 128.0のみです。 $ px = 0.0への変更; (この場合、画像は反射光からのみ復元されます)



さて、作業の結果。

ソース画像

画像






記録されたホログラムとそれから再構成された画像

画像画像






1/3のホログラム記録とそこから復元された画像

画像画像






ホログラムレコードの2/3以上で上書きされ、それから再構築された画像

画像画像






3つのポイントと光放射の波長W = 1の場合の例を次に示します



大きな音には2つの理由があります。

  1. 実験では、ポイントの輝度は0..255の範囲の整数に丸められます。 情報の一部は破棄された小数部分で失われ、範囲はもちろん小さくなります。
  2. 小さなホログラム領域、わずか50 x 50ポイント。 これは実際のホログラムの1平方ミリメートルよりはるかに小さいです。 現実には、5000ライン/ mmの解像度の写真素材を使用してホログラムを取得しています。




3次元ホログラムが必要な場合、これによりアルゴリズムが複雑になることはありません。 距離Dの計算式を変更するだけで十分です(ホログラムはフラットになり、Z座標は常に1になります)



これがそのような実験です。



All Articles