2

画像データを含むDICOMファイルを使用しています。pydicomを使用して.DCMファイルからメタデータを読み取ります。これで、.DCMファイルから抽出されたピクセルデータが2次元のnumpyndarrayとして返されます。
私が使用している特定のDICOMファイルは、ピクセルごとに1つの強度値を保存します。それらに対していくつかの操作を実行した後、2次元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.87629 、、
...、
[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](R = G = B =強度値)に置き換えることで、これをnumpyの3Dndarrayに変換したいと思います。

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.   

提案?これらの画像の一部は巨大であるため、データ操作をできるだけ軽くしようとしています。そのため、ハッキングやすべてのデータを別の変数に手動でコピーすることは避けたいと思います。

助けてくれてありがとう。

4

1 に答える 1

2

したがって、もちろん、必要なのは形状mxnxrの配列です。ここで、rはタプルサイズです。

これを行う1つの方法は、私にとって最も簡単なことです。(i)追加された最後の次元rを追加することを除いて、元の2D配列と同じ3Dグリッド配列を明示的に作成します。(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]])

次に、グリッド配列を作成します。

>>> 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の3つの連続したスライスを見ると、グリッドGにあるrgbタプルを確認できます。

>>> 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配列を作成する必要があります。この配列の最初の2次元は、.DCMファイルに格納されている配列から取得され、3次元は3です。 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)
于 2011-06-25T00:01:57.647 に答える