0

dicom 画像を処理するために pydicom を使用したいと考えていました。残念ながら、エラーが発生します

File "/usr/local/lib/python2.7/dist-packages/dicom/dataset.py", line 372, in _pixel_data_numpy
    raise TypeError(msg % (numpy_format, self.PixelRepresentation,
UnboundLocalError: local variable 'numpy_format' referenced before assignment

関数で

def _pixel_data_numpy(self):
"""Return a NumPy array of the pixel data.

NumPy is a numerical package for python. It is used if available.

:raises TypeError: if no pixel data in this dataset.
:raises ImportError: if cannot import numpy.

"""
if 'PixelData' not in self:
    raise TypeError("No pixel data found in this dataset.")

if not have_numpy:
    msg = "The Numpy package is required to use pixel_array, and numpy could not be imported.\n"
    raise ImportError(msg)

# determine the type used for the array
need_byteswap = (self.is_little_endian != sys_is_little_endian)

# Make NumPy format code, e.g. "uint16", "int32" etc
# from two pieces of info:
#    self.PixelRepresentation -- 0 for unsigned, 1 for signed;
#    self.BitsAllocated -- 8, 16, or 32
format_str = '%sint%d' % (('u', '')[self.PixelRepresentation],
                          self.BitsAllocated)
try:
    numpy_format = numpy.dtype(format_str)
print numpy_format
except TypeError:
print "Data type not understood by NumPy!"
print format_str
    msg = ("Data type not understood by NumPy: "
           "format='%s', PixelRepresentation=%d, BitsAllocated=%d")
    raise TypeError(msg % (numpy_format, self.PixelRepresentation,
                    self.BitsAllocated))

# Have correct Numpy format, so create the NumPy array
arr = numpy.fromstring(self.PixelData, numpy_format)

# XXX byte swap - may later handle this in read_file!!?
if need_byteswap:
    arr.byteswap(True)  # True means swap in-place, don't make a new copy
# Note the following reshape operations return a new *view* onto arr, but don't copy the data
if 'NumberOfFrames' in self and self.NumberOfFrames > 1:
    if self.SamplesPerPixel > 1:
        arr = arr.reshape(self.SamplesPerPixel, self.NumberOfFrames, self.Rows, self.Columns)
    else:
        arr = arr.reshape(self.NumberOfFrames, self.Rows, self.Columns)
else:
    if self.SamplesPerPixel > 1:
        if self.BitsAllocated == 8:
            arr = arr.reshape(self.SamplesPerPixel, self.Rows, self.Columns)
        else:
            raise NotImplementedError("This code only handles SamplesPerPixel > 1 if Bits Allocated = 8")
    else:
        arr = arr.reshape(self.Rows, self.Columns)
return arr

変数format_strを出力すると、 が得られuint12ます。残念ながら、このバグを解決することはできません。それを解決するために私にできることはありますか?
すべてのコマンドを削除してもprint(デバッグ用に追加しました)、同じエラーが発生します。

4

2 に答える 2

2

ここには 2 つの問題があります。まず、pydicom のバグ: エラーを発生させる際に、numpy_format未定義の を誤って使用しています。を使用する必要がありますformat_str。これを修正するために問題を追加します。

2 番目の問題は、ファイルが 12 の BitsAllocated を持っていると主張していることです。これは非常に珍しいことです。通常、DICOM ファイルには 12 ビットのピクセル値がありますが、ファイルではピクセルあたり 16 ビットを使用します。

とをピクセル データのサイズRowsと比較することで、実際に割り当てられているものを確認できます。Columns単一フレーム画像の場合 (以下の例では、pydicom の CT_small.dcm サンプル ファイルを使用しています):

>>> len(ds.PixelData)
32768
>>> ds.Rows * ds.Columns * 2  # 2 bytes for 16-bit allocation
32768

画像に複数のフレームがある場合は、フレーム数も掛ける必要があります。についても同様ですSamplesPerPixel

ピクセル データのサイズが 1 ピクセルあたり 2 バイトを使用して上記のように一致する場合はds.BitsAllocatedpixel_array.

于 2015-01-22T13:33:01.133 に答える
0

コードは次のようにフォーマットされることを意図していると思います:

try:
    numpy_format = numpy.dtype(format_str)
    print numpy_format
except TypeError:
    print "Data type not understood by NumPy!"
    print format_str
    msg = ("Data type not understood by NumPy: "
           "format='%s', PixelRepresentation=%d, BitsAllocated=%d")
    raise TypeError(msg % (numpy_format, self.PixelRepresentation,
                    self.BitsAllocated))

tryブロックでは、numpy_format値が割り当てられます。がnumpy.dtype(format_str)をスローすると、値を にバインドせずTypeErrorにブロックに直行します。これは、 を発生させたときに が再度参照されると、そもそもバインドされていないため、 がスローされることを意味します。exceptnumpy_formatnumpy_formatTypeErrorUnboundLocalError

于 2015-01-21T21:11:41.713 に答える