Невозможно правильно передать поток байтов с серверов DICOM-WADO.Python

Программы на Python
Anonymous
Невозможно правильно передать поток байтов с серверов DICOM-WADO.

Сообщение Anonymous »

DICOM — это формат файла, используемый сканерами МРТ для хранения МРТ и метаданных.

Серверы DICOM, которые передают изображения DICOM через HTTP, должны соответствовать спецификации WADO для извлечения DICOM.
Когда я использую запросы с MultipartDecoder в Requests-toolbelt, я могу успешно получать файлы DICOM с потоковым ответом.
Когда я использую метод потоковой передачи httpx, полученные части являются недействительными DICOM.
К сожалению, мне не удалось найти общедоступный сервер WADO, который помог бы вам проверить это. Надеюсь, вы его найдете.
Как это сделать? Я это исправлю?
Вот код Python для воспроизведения.
В коде каждая часть_ должна представлять собой байты для одного файла DICOM.

Код: Выделить всё

import asyncio
import io
import logging
import httpx
import pydicom
import requests
from requests_toolbelt.multipart import decoder

logger = logging.getLogger(__name__)

async def async_wado(study_instance_uid, wado_request_url, wado_request_header):
with httpx.Client().stream(method="GET", url=wado_request_url, headers=wado_request_header) as response:
for part_ in response.iter_bytes():
dicom_slice_ = pydicom.dcmread(io.BytesIO(part_),)
# InvalidDicomError,Invalid DICOM header metadata or DICM Missing

def sync_wado(study_instance_uid, wado_request_url, wado_request_header):
wado_response = requests.get(wado_request_url, headers=wado_request_header)
mp_data = decoder.MultipartDecoder.from_response(wado_response)
for count, part_ in enumerate(mp_data.parts, start=1):
if 'application/dicom' in part_.headers[b'Content-Type'].decode(encoding='utf-8'):
dicom_slice_ = pydicom.read_file(io.BytesIO(part_.content))
# Works. .dcm file correctly read, can be saved to disk.

if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
study_instance_uid = ""
wado_request_url = f"https://:/wado-rs/dicom_web/studies/{study_instance_uid}"
wado_request_header = { 'Accept': 'multipart/related; type=application/dicom' }

sync_wado(study_instance_uid, wado_request_url, wado_request_header)
asyncio.run(async_wado(study_instance_uid, wado_request_url, wado_request_header))
Это ошибка:

Код: Выделить всё

pydicom.errors.InvalidDicomError: File is missing DICOM File Meta Information header or the 'DICM' prefix is missing from the header. Use force=True to force reading.
force=True выдает неполный файл и метаданные.

Подробнее здесь: https://stackoverflow.com/questions/788 ... do-servers

Вернуться в «Python»