3

我知道我可以使用以下代码查看 dicom 文件:

import dicom
from dicom.contrib.pydicom_PIL import show_PIL

f = "CT-MONO2-8-abdo.dcm"
ds = dicom.read_file(f, force=True)
show_PIL(ds)

但是,如何从多帧 DICOM 文件中提取和查看所有帧?我尝试使用上面的代码,但出现以下错误:

File "/home/auser/.local/lib/python3.5/site-packages/dicom/dataset.py", line 399, in _get_pixel_array
  raise NotImplementedError("Pixel Data is compressed in a format pydicom does not yet handle. Cannot return array")
NotImplementedError: Pixel Data is compressed in a format pydicom does not yet handle. Cannot return array

我曾尝试使用位于http://www.barre.nom.fr/medical/samples/的一些多帧文件。像素大小等可用于这些文件。

如何提取和/或查看多帧 DICOM 文件的不同帧?


编辑:使用 gdcm 的以下命令可在 Linux 上将这些文件转换为未压缩文件:

$ gdcmconv --raw compressed.dcm uncompressed.dcm

(我在提取后使用了http://www.barre.nom.fr/medical/samples/files/US-PAL-8-10x-echo.gz文件)。

然后由上面的 python 代码读取,但只显示第一帧。如何提取和查看其他帧?

4

1 回答 1

3

pydicom 支持读取像素数据。请参阅文档。

pydicom 在解释 DICOM 数据时往往“懒惰”。例如,默认情况下,除了读取原始字节之外,它不会对像素数据做任何事情:

import dicom
ds=dicom.read_file("MR_small.dcm")
ds.PixelData
'\x89\x03\xfb\x03\xcb\x04\xeb\x04\xf9\x02\x94\x01\x7f ...
...

关于pixel_array

Dataset 的一个名为 pixel_array 的属性为未压缩的图像提供了更有用的像素数据。必须在您的系统上安装 NumPy 数值包才能使用此属性,因为 pixel_array 返回一个 NumPy 数组:

import dicom
ds=dicom.read_file("MR_small.dcm")
ds.pixel_array
array([[ 905, 1019, 1227, ...,  302,  304,  328],
       [ 628,  770,  907, ...,  298,  331,  355],
       [ 498,  566,  706, ...,  280,  285,  320],
       ...,
       [ 334,  400,  431, ..., 1094, 1068, 1083],
       [ 339,  377,  413, ..., 1318, 1346, 1336],
       [ 378,  374,  422, ..., 1369, 1129,  862]], dtype=int16)
ds.pixel_array.shape
(64, 64)

文档还解释了在http://pydicom.readthedocs.io/en/stable/viewing_images.html查看图像。

如错误消息中所述(以及@kritzel_sw 在评论中),pydicom 尚不支持源图像的传输语法。在尝试提取帧之前,使用其他工具更改传输语法。

Rony 的另一个有用的博客http://dicomiseasy.blogspot.in/2012/08/chapter-12-pixel-data.html

还要检查这个Stack Overflow 问题;它是关于旧版本的,但可能会有所帮助。

于 2017-12-08T06:52:59.317 回答