我正在处理包含图片数据的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.
连连呢?我试图保持数据操作尽可能轻,因为其中一些图像很大,所以我想避免黑客/手动将所有数据复制到一个单独的变量。
提前感谢您的帮助。
答案 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)