2013-10-20 189 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

噢,对不起,不知道那里发生了什么 –