【问题标题】:Pydicom.read_file is only working with some Dicom imagesPydicom.read_file 仅适用于一些 Dicom 图像
【发布时间】:2020-09-21 09:02:04
【问题描述】:

我正在制作一个可以使用 pydicom 库将 .dcm 图像转换为 .jpg 的 python 应用程序。这是我的代码:

import pydicom
import cv2
import numpy as np

filename = 'testDicom.dcm'

#get pixel data from image
ds = pydicom.read_file(filename, force=True)
image = ds.pixel_array

new_img = []
max_value = None
min_value = None

#get maximum and minimum pixel values
for i in image:
    for l in i:
        if max_value:
            if l > max_value:
                max_value = l
        else:
            max_value = l

        if min_value:
            if l < min_value:
                min_value = l
        else:
            min_value = l

#use maximum and minimum pixel values to map pixel values between 0 and 255
for i in image:
    row = []
    for pixel in i:
        row.append((pixel - min_value) / (max_value / 255.0))
    new_img.append(row)

#convert to numpy array
new_img = np.array(new_img)

#save image
cv2.imwrite(filename.replace('.dcm', '.jpg'), new_img)

我已经在两个文件上进行了测试。第一个,

https://github.com/MaxwellMarcus/Training-Data-Creator/blob/master/testDicom.dcm

工作正常。

第二个,

https://github.com/MaxwellMarcus/Training-Data-Creator/blob/master/testDicom2.dcm

报错:

Traceback (most recent call last):
  File "C:\Users\Max Marcus\github\Training-Data-Creator\creator.py", line 6, in <module>
    image = ds.pixel_array
  File "C:\Python38\lib\site-packages\pydicom\dataset.py", line 1615, in pixel_array
    self.convert_pixel_data()
  File "C:\Python38\lib\site-packages\pydicom\dataset.py", line 1324, in convert_pixel_data
    self._convert_pixel_data_without_handler()
  File "C:\Python38\lib\site-packages\pydicom\dataset.py", line 1409, in _convert_pixel_data_without_handler
    raise RuntimeError(msg + ', '.join(pkg_msg))
RuntimeError: The following handlers are available to decode the pixel data however they are missing required dependencies: GDCM (req. GDCM)

有谁知道为什么这两个文件只有一个会发生这种情况,或者如何解决?

【问题讨论】:

    标签: python pydicom


    【解决方案1】:

    第二张图片是压缩过的dicom图片,pydicom使用GDCM和Pillow(for jpg, jpeg)等不同的包来处理这些图片。

    安装其中一个包可以解决问题。

    【讨论】:

    • 感谢您的回复。我运行了您建议的命令,但出现此错误:Error
    • 如果你在 conda 上工作,你用什么来安装 pakages pip 或 conda 那么你可以看看这个anaconda.org/conda-forge/gdcm
    • 我正在使用 python 3.6.10,而您正在使用 3.7 并根据错误。 GDCM 仅适用于 python version=[2.7.*|3.5.*|3.6.*|3.4.*]
    • 在 anaconda 上收到同样的错误后,我可以使用 conda install -c conda-forge gdcm 正确运行我的。
    【解决方案2】:

    您有一个包含压缩像素数据的数据集。 pydicom 本身只能处理未压缩的 Pixel Data,但如果你 install one or more optional libraries 则它可以处理各种压缩。 This table 告诉你需要哪个包。

    对于 JPEG 无损、非分层、一阶预测 (1.2.840.10008.1.2.4.70),列出的唯一可用软件包是 GDCM,不幸的是,这意味着您要么需要安装 Conda(并且在 conda-forge 上其 only available on Windows up to Python 3.6) 或 linux。幸运的是,我一直在开发一个新的包,它也支持 JPEG 无损:pylibjpeg-libjpeg 插件。

    $ pip install pylibjpeg pylibjpeg-libjpeg pydicom
    
    from pydicom import dcmread
    import pylibjpeg
    
    ds = dcmread("testDicom2.dcm")
    arr = ds.pixel_array
    

    查看您的数据,我会说 Photometric Interpretation 值也是错误的。先把它改成 YBR_FULL:

    from pydicom import dcmread
    import pylibjpeg
    
    ds = dcmread("testDicom2.dcm")
    ds.PhotometricInterpretation = 'YBR_FULL'
    arr = ds.pixel_array
    

    【讨论】:

    • 您好,感谢您的回答。但是,在遵循您的建议后,我仍然面临同样的错误。有什么线索可以解决这个问题吗?
    • 你可以试试pip install python-gdcm,这是一个新项目,它为 GDCM 构建 Python 包装器,并且应该在 Windows 上可以使用轮子,直到 Python 3.9
    • 您好,谢谢您的回答。我已经安装了 python-gdcm 和 pylibjpeg,但是错误仍然存​​在。一直在寻找解决方案,但仍然没有运气(我使用的是 python 3.7)
    • 您的工作目录中没有gdcm 文件夹吗?
    • 您好,已安装的 gdcm 在我的安装目录中,但不在我存储/读取这些 DICOM 文件的工作目录中。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2021-05-13
    • 2012-07-28
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多