基于2-D的元素,有效地将n-dumpy ndarray从2-D重新塑造为3-D

时间:2011-06-24 20:49:31

标签: python numpy matrix pydicom

我正在处理包含图片数据的DICOM个文件。我正在使用pydicom来读取.DCM文件中的元数据。现在,从.DCM文件中提取的像素数据将作为二维numpy ndarray返回 我正在使用的特定DICOM文件为每个像素保存一个强度值。在对它们执行一些操作之后,我在二维ndarray中以每个像素的单个浮点值(在0.0和1.0之间)结束:

  

[

     
    

[0.98788927,0.98788927 0.98788927,...,0.88062284 0.89532872 0.87629758],
     [0.98788927,0.98788927,0.98788927,...,0.8884083,0.89446367,0.87889273],
     [0.98788927,0.98788927,0.98788927,...,0.89100346,0.89532872,0.87629758],
     ,...,
     [0.97491349,0.97491349,0.97491349,...,0.74480969,0.72318339,0.73269896],
     [0.97491349,0.97491349,0.97491349,...,0.74913495,0.74480969,0.74740484],
     [0.97491349,0.97491349,0.97491349,...,0.74913495 0.75865052,0.75086505],

  
     

]

我想通过用一系列元素[R,G,B]替换每个元素将其转换为具有numpy的3-D ndarray,其中R = G = B =强度值。

ndarray.put()函数展平了排除该方法的矩阵。

我也尝试过:

for x in range( len(a[0]) ):
  for y in range( len(a) ):
    a[x][y] = [ a[x][y], a[x][y], a[x][y] ]

但是得到了

ValueError: setting an array element with a sequence.   

连连呢?我试图保持数据操作尽可能轻,因为其中一些图像很大,所以我想避免黑客/手动将所有数据复制到一个单独的变量。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

所以你想要的是一个形状 m x n x r 的数组,其中 r 是元组大小。

这样做的一种方法,在我看来最直接的方法是:(i)明确创建一个3D网格数组,与原始2D数组相同,除了添加最后一个维度, r ,已添加,然后; (ii)将你的rgb元组映射到这个网格上。

>>> # first, generate some fake data:
>>> m, n = 5, 4            # rows & cols, represents dimensions of original image
>>> D = NP.random.randint(0, 10, m*n).reshape(m, n)
>>> D
    array([[8, 2, 2, 1],
           [7, 5, 0, 9],
           [2, 2, 9, 3],
           [5, 7, 3, 0],
           [5, 8, 1, 7]])

现在创建Grid数组:

>>> G = NP.zeros((m, n, r), dtype='uint')

将G视为 mxn 矩形网格 - 与D相同 - 但是20个单元格中的每一个都不存储整数(如D),而是存储rgb元组,因此:

>>> # placing the color pixel (209, 127, 87) at location 3,2:
>>> G[3,2] = (209, 124, 87)

为了理解这个结构,你可以通过查看G的三个连续切片来看到网格中的rgb元组,G:

>>> G[:,:,0]      # red
>>> array([[  0,   0,   0,   0,   0],
           [  0,   0,   0,   0,   0],
           [  0,   0,   0,   0,   0],
           [  0,   0, 209,   0,   0],
           [  0,   0,   0,   0,   0]], dtype=uint8)

>>> G[:,:,1]    # green
>>> array([[  0,   0,   0,   0,   0],
           [  0,   0,   0,   0,   0],
           [  0,   0,   0,   0,   0],
           [  0,   0, 124,   0,   0],
           [  0,   0,   0,   0,   0]], dtype=uint8)

>>> G[:,:,2]   # blue
>>> array([[ 0,  0,  0,  0,  0],
           [ 0,  0,  0,  0,  0],
           [ 0,  0,  0,  0,  0],
           [ 0,  0, 87,  0,  0],
           [ 0,  0,  0,  0,  0]], dtype=uint8)

现在要真正得到你想要的结果,我们只需要(i)创建一个网格G,一个3D NumPy数组,其前两个维度取自存储在.DCM文件中的数组,其第三维从rgb元组的长度是;然后(ii)将rgb元组映射到该网格上,G。

>>> # create the Grid
>>> G = NP.zeros((m, n, r), dtype='uint')
>>> # now from the container that holds your rgb tuples, create *three* m x n arrays, 
>>> # one for each item in your rgb tuples

>>> # now just map the r values (1st itm in each rgb tuple) to the 3D grid
>>> G[:,:,0] = r_vals
>>> G[:,:,1] = g_vals
>>> G[:,:,2] = b_vals

>>> G.shape
    (5, 4, 3)