2

私は3次元のバイト配列を持っています。

3 次元配列は jpeg 画像を表します。各チャネル/配列は、RGB スペクトルの一部を表します。

黒いピクセルを保持することに興味はありません。黒のピクセルは、次の非典型的な配置で表されます。

myarray[0,0,0] =0;
myarray[0,0,1] =0;
myarray[0,0,2] =0;

byte[] AFlatArray = new byte[width x height x 3]したがって、これを行ってから座標にそれぞれ値を割り当てることにより、この 3 次元配列を 1 次元配列にフラット化しました。

しかし、私が言ったように、黒いピクセルは必要ありません。したがって、この配列には、x、y 座標のカラー ピクセルのみを含める必要があります。私が望む結果は、黒以外のピクセルのみを含む i 次元のバイト配列から画像を再表現することです。それ、どうやったら出来るの?

xy座標系のため、黒いピクセルも保存する必要があるようです。バイナリ ファイルに書き込もうとしましたが、jpeg ファイルは圧縮されているため、そのファイルのサイズは jpeg ファイルよりも大きくなります。


赤、緑、青のコンポーネントを持つ画像があるため、1 バイト配列が必要です。2つの画像の違いを保存したい。したがって、これは 3 次元配列です。すべてのピクセルが異なるわけではないので、違いだけを保存したいと思いました。ただし、サイズを平坦化しても、画像のバイト サイズよりも大きいままです (JPEG で圧縮されているため)。

emgu 画像フレームワークを使用しています。画像のデータを列挙すると、それぞれバイト配列の次元で表される 3 つのチャネルが得られます。私が使用している 3 つのチャンネルは、(R)ed、(G)reen、(B)lue です。HSL や HSV (など) の色空間で作業し、色相、彩度、輝度の 3 つのチャネルで作業することができます。

4

2 に答える 2

0

ジャグ配列でない場合:

byte[] newArray = new byte[oldArray.Length];
for(int i = 0; i < oldArray.GetLength(0); i++) {
    for(int k = 0; k < oldArray.GetLength(1); k++) {
        for(int j = 0; j < oldArray.GetLength(2); j++) {
            int index = i * oldArray.GetLength(1) * 
                oldArray.GetLength(2) + k * oldArray.GetLength(2) + j;
            newArray[index] = oldArray[i, k, j];
        }
    }
}

または、代わりに単一のループで:

   byte[] newArray = new byte[oldArray.Length];
   for (int i = 0; i < oldArray.Length; i++) {
       int ind3 = i % oldArray.GetLength(2);
       int ind2 = i / oldArray.GetLength(2) % oldArray.GetLength(1);
       int ind1 = i / (oldArray.GetLength(1) * oldArray.GetLength(2));
       newArray[i] = oldArray[ind1, ind2, ind3];
   }

ギザギザの配列の場合、3D 配列の要素の正確な合計数がわからない場合は、リストを使用し、要素をリストに追加しながら 3 次元をループしてから、List.ToArray() を使用します。リストを 1D 配列に変換します。

于 2013-10-20T18:13:12.533 に答える