Набор данных pydicom: send_c_find возвращает успех, но в файле status.pixel_array содержится текст ошибки - PullRequest
2 голосов
/ 09 марта 2019

Я использую dcm4chee в качестве сервера PACS и пытаюсь получить исследование на основе имени пациента.

Соответствующий код:

ae = AE()
ae.add_requested_context(PatientRootQueryRetrieveInformationModelFind)
ae.add_requested_context(VerificationSOPClass)
assoc = ae.associate(config['pacs_remotehost']['ip'], config['pacs_remotehost']['ports']['DICOM'],ae_title='DCM4CHEE')

if assoc.is_established:
    ds = Dataset()
    ds.PatientName = '*************' #name erased 
    ds.QueryRetrieveLevel = 'PATIENT'
    ds.StudyInstanceUID = ''
    responses = assoc.send_c_find(ds, query_model='P')
    for (status, identifier) in responses:
        if status:
           print('C-FIND query status: 0x{0:04x}'.format(status.Status))

           # If the status is 'Pending' then `identifier` is the C-FIND response
           if status.Status in (0xFF00, 0xFF01):
               print(identifier)
        else:
           print('Connection timed out, was aborted or received invalid response')

# Release the association
    assoc.release()
else:
    print('Association rejected, aborted or never connected')

Я добился успехасигнал:

Состояние запроса C-FIND: 0x0000

Но когда я хочу получить доступ к пиксельным данным, я набираю status.pixel_array, но вместо массива Numpy, он содержит следующую ошибку:

    File "<ipython-input-2-c65fb50a50a6>", line 1, in <module>
    status.pixel_array File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 552, in __getattr__
    return super(Dataset, self).__getattribute__(name)
  File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 949, in pixel_array
    self.convert_pixel_data()
  File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 816, in convert_pixel_data
    transfer_syntax = self.file_meta.TransferSyntaxUID
  File "/usr/local/lib/python2.7/site-packages/pydicom/dataset.py", line 552, in __getattr__
    return super(Dataset, self).__getattribute__(name)
AttributeError: 'Dataset' object has no attribute 'file_meta'

Кто-нибудь знает, почему я получаю эту ошибку, а не изображения?

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Я полностью согласен с тем, что сказал Амит Джоши, но я хотел бы добавить, что даже когда вы выполняете C-MOVE с идентификаторами, найденными в C-FIND, вы не сможете получить данные пикселей из Status.Статус передает только состояние операции C-FIND / C-MOVE, а не передаваемые данные.

Для C-MOVE (который гораздо чаще поддерживается, чем C-GET), Move-SCPоткроет соединение C-STORE с AE назначения перемещения и передаст изображения через это соединение.То есть C-MOVE передает только информацию о состоянии передачи изображения, а не сами изображения.

1 голос
/ 09 марта 2019

Я не совсем понял, что вы пытаетесь сделать (и не знаю, о какой технологии идет речь), но я думаю, что ваше понимание неверно.

Вы делаете ПАЦИЕНТ уровня C-FIND.Вы получаете ответы (соответствующие записи) и, наконец, ответ УСПЕХ.Хорошо.

Тогда вы пытаетесь получить доступ к элементу данных пикселей в этих ответах?- не имеет смысла.

C-FIND, не дают вам фактический экземпляр / изображение.Он просто дает вам записей , которые существуют на SCP и соответствуют вашим критериям поиска, и, наконец, ответ УСПЕХ.Если не найдено подходящих записей, возвращается только окончательный ответ SUCCESS.

Итак, вы хотите получить данные о пикселях для этих записей, но их там нет.Вы также должны выполнить C-MOVE (или C-GET) на основе идентификаторов, которые вы получили в своем ответе C-FIND.Я объяснил это подробно здесь .

Этот абзац будет немного сложным, и может иметь некоторые вариации в рабочем процессе с различными реализациями .Чтобы сделать CMove, должен существовать CStoreSCP.Вы (CMoveSCU) отправите команду CMove в PACS (CMoveSCP) с заголовком AE CStoreSCP, в который вы хотите получать экземпляры.Это означает, что либо вы должны также разработать свой собственный CStoreSCP, либо вы должны привлечь другого.CMoveSCP прочитает отправленный вами заголовок AE и сопоставит его со своими конфигурациями.Это означает, что ваш CStoreSCP должен быть предварительно настроен на PACS.Из конфигураций, он будет принимать IP-адрес и порт, где он будет устанавливать новую связь.Это называется переключением ролей.CMoveSCP теперь также работает как CStoreSCU.Выступая в роли CStoreSCU, PACS затем отправит экземпляры в ваш CStoreSCP.Таким образом, вы фактически получаете изображения / экземпляры.

Таким образом, вы фактически получаете экземпляры.Если у вас есть экземпляры, вы можете получить доступ к данным пикселей в этих экземплярах.

Пожалуйста, прочитайте эту отличную статью, чтобы узнать больше о том, как работает Q / R.


Простой пример из реальной жизни:

У вас есть таблица базы данных, которая содержит идентификатор человека и URL-адрес его фотографии профиля.Вы хотите загрузить эту фотографию профиля на свою веб-страницу.

Итак, сначала вы запускаете SQL-запрос (C-FIND в DICOM) и получаете записи.Затем из записей вы читаете URL.С помощью этого URL вы начинаете новое действие по загрузке фотографии с сервера (C-MOVE в DICOM).После того, как вы загрузили фотографию, вы можете загрузить ее на свою веб-страницу.

Дааа ... пример плохой и не совсем соответствует.Но, надеюсь, вы понимаете, что в этом участвуют два разных действия.

...