Невозможно прочитать файл dicom с Python3 и pydicom - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь прочитать файл dicom с библиотекой python3 и pydicom.Для некоторых данных 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)

Кто-нибудь сталкивался с такой же проблемой?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Можете ли вы привести пример для такого файла dicom?При запуске pydicom example с python 3.7 он работает отлично:

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)

enter image description here

Он также работает с примерами файлов dicomиз Образцы медицинских изображений .

0 голосов
/ 21 февраля 2019

Я полагаю, что причина проблемы в том, что Python (для меня это происходило только в Python 3, работающем на Centos 7.6 Linux, печатающем в окно терминала в MacOS), не может понять, как напечатать строку, содержащую не-ascii символ из-за настройки локали.Вы можете использовать команду locale, чтобы увидеть результаты.Мой начался со всего, установленного на "C".Я установил переменную среды LANG в en_US.UTF-8.С этой настройкой это сработало для меня.В csh это делается с помощью

setenv LANG en_US.UTF-8

При использовании bash:

export LANG=en_US.UTF-8

Моя проблема возникла из-за наличия 'µ' в элементе описания серии.Файл представлял собой карту затухания, полученную при реконструкции SPECT на сканере Siemens.Я использовал следующий код 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)

Это основано на функции myprint из] 1

Код пытается распечататьвсе элементы данных.Он перехватывает исключения и печатает «**** Ошибка печати значения» при возникновении ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...