1

我试图用 python3 和 pydicom 库读取 dicom 文件。对于某些 dicom 数据,当我尝试打印 pydicom.dcmread 的结果时,我无法正确获取数据并收到错误消息。

但是,我尝试使用 python2 并且效果很好。我检查了元信息并将其与其他可以处理的 dicom 文件进行了比较,我没有发现它们之间有任何区别。

import pydiom

ds = pydicom.dcmread("xxxxx.dicom")
print(ds)

Traceback (most recent call last):
  File "generate_train_data.py", line 387, in <module>
    tf.app.run()
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/platform/app.py", line 125, in run
    _sys.exit(main(argv))
  File "generate_train_data.py", line 371, in main
    create_ann()
  File "generate_train_data.py", line 368, in create_ann
    ds_ann_dir, case_name, merge_channel=False)
  File "generate_train_data.py", line 290, in process_dcm_set
    all_dcms, dcm_truth_infos = convert_dicoms(dcm_list, zs)
  File "generate_train_data.py", line 179, in convert_dicoms
    instance_num, pixel_spacing, img_np = extract_info(dcm_path)
  File "generate_train_data.py", line 147, in extract_info
    print(ds)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2277-2279: ordinal not in range(128)

有人遇到过同样的问题吗?

4

2 回答 2

1

你能举一个这样的dicom文件的例子吗?使用 python 3.7运行 pydicom示例时,它运行良好:

import matplotlib.pyplot as plt
import pydicom
from pydicom.data import get_testdata_files
filename = get_testdata_files("CT_small.dcm")[0]
ds = pydicom.dcmread(filename)
plt.imshow(ds.pixel_array, cmap=plt.cm.bone)

在此处输入图像描述

它还使用Medical Image Samples中的示例 dicom 文件。

于 2019-02-21T02:50:26.753 回答
1

我相信问题的原因是 Python(对我来说,它只发生在运行在 Centos 7.6 Linux 上的 Python 3 打印到 MacOS 上的终端窗口)无法弄清楚如何打印包含非 ascii 字符的字符串因为语言环境的设置。您可以使用 locale 命令查看结果。我的开始时一切都设置为“C”。我将 LANG 环境变量设置为 en_US.UTF-8。有了这个设置,它对我有用。在 csh 中,这是使用

setenv LANG en_US.UTF-8

在 bash 中使用:

export LANG=en_US.UTF-8

我的问题是由于系列描述元素中有“µ”。该文件是西门子扫描仪上 SPECT 重建的衰减图。我使用以下 Python 代码来帮助解决问题。

#! /usr/bin/env python3
import pydicom as dicom
from sys import exit, argv

def myprint(ds, indent=0):
    """Go through all items in the dataset and print them with custom format
    Modelled after Dataset._pretty_str()
    """
    dont_print = ['Pixel Data', 'File Meta Information Version']

    indent_string = "   " * indent
    next_indent_string = "   " * (indent + 1)

    for data_element in ds:
        if data_element.VR == "SQ":   # a sequence
            print(indent_string, data_element.name)
            for sequence_item in data_element.value:
                myprint(sequence_item, indent + 1)
                print(next_indent_string + "---------")
        else:
            if data_element.name in dont_print:
                print("""<item not printed -- in the "don't print" list>""")
            else:
                repr_value = repr(data_element.value)
                if len(repr_value) > 50:
                    repr_value = repr_value[:50] + "..."
                try:
                    print("{0:s} {1:s} = {2:s}".format(indent_string,
                                                   data_element.name,
                                                   repr_value))

                except:
                    print(data_element.name,'****Error printing value')

for f in argv[1:]:
    ds = dicom.dcmread(f)
    myprint(ds, indent=1)

这是基于来自] 1的 myprint 函数

该代码尝试打印出所有数据项。它捕获异常并在出现错误时打印“****Error printing value”。

于 2019-02-21T02:31:14.850 回答