2013-10-20 193 views
1

我有一個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],然後分配相應的座標值平坦化該3D陣列出到一維數組。

但就像我說過的我不想黑色像素。所以這個數組只能包含帶有x,y座標的彩色像素。我想要的結果是從僅包含非黑色像素的i維字節數組重新表示圖像。我怎麼做?

它看起來像我必須存儲黑色像素以及由於xy座標系統。我已經嘗試寫入二進制文件,但該文件的大小大於jpeg文件,因爲jpeg文件是壓縮的。


我需要一個單字節數組,因爲我有一個具有紅色綠色和藍色組件的圖像。我想存儲2張圖片的區別。所以,這是一個3個暗淡的陣列。由於不是所有的像素都會有所不同,我只想存儲差異。但是,即使平坦化尺寸仍然大於圖像的字節大小(因爲它是一個JPEG和壓縮)。

我正在使用emgu圖像框架。當你枚舉一幅圖像的數據時,它可以給你3個通道,每個通道用一個字節數組中的維度表示。我正在使用的3個頻道是(R)ed,(G)reen和(B)lue。我可以在HSL或HSV(等)的色彩​​空間工作,然後我可以使用3個色調,飽和度和亮度通道。

+0

爲什麼你需要一個單字節數組,出於好奇? :) – Ryan

+0

@minitech我有一個圖像,它有紅色的綠色和藍色的組件。我想存儲2張圖片的區別。所以,這是一個3個暗淡的陣列。由於不是所有的像素都會有所不同,我只想存儲差異。但是,即使平坦化尺寸仍然大於圖像的字節大小(因爲它是一個JPEG和壓縮)。所以,沒有人回答解決了我的問題,但他們確實回答了這個問題 –

+0

我不明白兩張圖片之間的區別是如何構成一個三維數組。你的意思是一維有3個部分(RGB)? – Ryan

回答

1

通過將三個維度相乘來計算總大小,分配結果數組,並使用三個嵌套循環 - 每個維度一個循環。爲輸出數組中的當前位置創建一個計數器;增加該計數器爲你把物品放入輸出數組 - 這樣的事情:

byte[,,] threeD = new byte[X,Y,Z]; 
byte[] res = new byte[X*Y*Z]; 
int pos = 0; 
for (int x = 0 ; x != X ; x++) 
    for (int y = 0 ; y != Y ; y++) 
     for (int z = 0 ; z != Z ; z++) 
      res[pos++] = threeD[x,y,z]; 
0

如果它不是一個jagged陣列:

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數組中元素的確切總數,在這種情況下,我將使用列表,在添加元素的同時循環三個維度放入列表中,然後使用List.ToArray()將列表轉換爲一維數組。

+1

他們都是O(n)... – Ryan

+0

噢,對不起,不知道那裏發生了什麼 –