Skip to main content

通过 WADO、MINT、RAD69 和 DICOM-QR 检索医学图像

项目描述

双控手推车

CI 派皮 PyPI - Python 版本 代码风格:黑色 用 mypy 检查

通过 WADO、MINT、RAD69 和 DICOM-QR 检索医学图像

  • 需要 python 3.7、3.8 或 3.9
  • 用途pydicompynetdicom。图像和查询结果是pydicom.Dataset实例
  • 多线程下载使用requests-futures

手推车

安装

pip install dicomtrolley

用法

基本示例

# Create a http session
session = create_session("https://server/login",user,password,realm)
                           
# Use this session to create a trolley using MINT and WADO
trolley = Trolley(searcher=Mint(session, "https://server/mint"),
                  wado=Wado(session, "https://server/wado"))

# find some studies (using MINT)
studies = trolley.find_studies(Query(PatientName='B*'))  

# download the fist one (using WADO)
trolley.download(studies[0], output_dir='/tmp/trolley')

寻找研究

studies = trolley.find_studies(Query(PatientName='B*'))

基本查询参数可以在core.Query中找到。可以在fields.py中找到有效的包含字段(哪些信息会被发回) :

studies = trolley.find_studies(
    Query(modalitiesInStudy='CT*', 
               patientSex="F", 
               min_study_date=datetime(year=2015, month=3, day=1),
               max_study_date=datetime(year=2020, month=3, day=1),
               include_fields=['PatientBirthDate', 'SOPClassesInStudy']))

查找系列和实例详细信息

要同时包含系列和实例级别信息,请使用queryLevel参数

studies = trolley.find_studies(      # find studies series and instances
    Query(studyInstanceID='B*', 
          query_level=QueryLevels.INSTANCE))

a_series = studies.series[0]         # studies now contain series    
an_instance = a_series.instances[0]  # and series contain instances

下载数据

可以下载任何研究、系列或实例

studies = trolley.find_studies(Query(PatientName='B*',
                                     query_level=QueryLevels.INSTANCE))

path = '/tmp/trolley'
trolley.download(studies, path)                             # all studies
trolley.download(studies[0]), path                          # a single study
trolley.download(studies[0].series[0], path)                # a single series
trolley.download(studies[0].series[0].instances[:3], path)  # first 3 instances

对下载的更多控制:pydicom.Dataset直接获取实例

studies = trolley.find_studies(              # find study including instances
    Query(PatientID='1234', 
          query_level=QueryLevels.INSTANCE)

for ds in trolley.get_dataset(studies):      # obtain Dataset for each instance
    ds.save_as(f'/tmp/{ds.SOPInstanceUID}.dcm')

多线程下载

trolley.download(studies, path, 
                 use_async=True,  # enable multi-threaded downloading 
                 max_workers=4)   # optionally set number of concurrent workers
                                  # defaults to None which lets python decide

仅使用 WADO,不使用搜索

from dicomtrolley.wado import Wado
from dicomtrolley.core import InstanceReference

instance = InstanceReference(series_instance_uid='1.2.1', study_instance_uid='1.2.2', sop_instance_uid='1.2.3')

wado = Wado(session, wado_url)
for ds in wado.datasets([instance]):
  ds.save_as(f'/tmp/{ds.SOPInstanceUID}.dcm')

DICOM-QR

Trolley可以使用 DICOM-QR 代替 MINT 作为搜索方法。有关查询详细信息,请参阅dicom_qr.DICOMQuery

dicom_qr = DICOMQR(host,port,aet,aec)
trolley = Trolley(searcher=dicom_qr, downloader=wado)

# Finding is similar to MINT, but a DICOMQuery is used instead
trolley.find_studies(  
    query=DICOMQuery(PatientName="BAL*",   
                     min_study_date=datetime(year=2015, month=3, day=1),
                     max_study_date=datetime(year=2015, month=4, day=1),
                     include_fields=["PatientBirthDate", "SOPClassesInStudy"],
                     query_level=QueryRetrieveLevels.STUDY)) 

RAD69

RAD69协议是wado下载 DICOM 图像的替代方案。

dicom_qr = DICOMQR(host,port,aet,aec)
trolley = Trolley(searcher=dicom_qr, 
                  downloader=Rad69(session=session,
                                   url="https://server/rad69"))

studies = trolley.find_studies(Query(PatientName="AB*"))
trolley.download(studies[0], path)  # rad69 download works exactly like wado 
trolley.download(studies[1], path,  
                 use_async=True)    # multi-threaded download is supported

下载格式

默认情况下,trolley 将下载内容写入磁盘StudyID/SeriesID/InstanceID,将文件分类到单独的研究和系列文件夹中。您可以通过将DICOMDiskStorage实例传递给 trolley 来更改此设置:

from dicomtrolley.storage import FlatStorageDir

#  Creates no sub-folders, just write to single flat file
storage = FlatStorageDir(path=tmpdir)
trolley = Trolley(searcher=mint, downloader=wado,
                  storage=storage)

您可以通过子类化 storage.DICOMDiskStorage创建自己的自定义存储方法 :

from dicomtrolley.storage import DICOMDiskStorage

class MyStorage(DICOMDiskStorage):
  """Saves to unique uid filename"""
  def save(self, dataset, path):    
    dataset.save_as(Path(path) / uuid.uuid4())

trolley = Trolley(searcher=mint, downloader=wado,
                  storage=MyStorage())

DICOM 查询类型

对于大多数 DICOM 查询,您可以使用Query实例:

from dicomtrolley.core import QueryLevels 
trolley.find_studies(Query(PatientID='1234', 
                           query_level=QueryLevels.INSTANCE)

如果您想更好地控制特定于后端的选项,您可以使用特定于后端的查询,例如MintQueryDICOMQuery。然后查询需要匹配后端:

trolley = Trolley(searcher=Mint(session, "https://server/mint"),
                  wado=Wado(session, "https://server/wado"]))
trolley.find_studies(MintQuery(PatientID='1234', limit=5))

例子

备择方案

  • dicomweb-client - 支持 QIDO-RS、WADO-RS 和 STOW-RS 的活动库。
  • pynetdicom - dicomtrolley 的 DICOM-QR 支持基于 pynetdicom. Pynetdicom 支持广泛的 DICOM 网络交互,可用作独立应用程序。

注意事项

Dicomtrolley 已针对 Vitrea Connection 8.2.0.1 系统进行了开发和测试。这声称与 WADO 和 MINT 1.2 接口一致,但并未实现这些标准的所有部分。

某些查询参数值和限制可能特定于 Vitrea Connection 8.2.0.1。例如,可以从查询返回的 DICOM 元素的确切列表对于不同的服务器可能不同。

贡献

你可以通过不同的方式做出贡献

报告错误

在https://github.com/sjoerdk/clockify_api_client/issues报告错误。

贡献代码

获取代码

fork 这个 repo,创建一个特性分支

设置环境

dicomtrolley 使用诗歌进行依赖和包管理

  • 安装诗歌(参见诗歌文档
  • 创建一个虚拟环境。转到克隆 dicomtrolley 的文件夹并使用
    poetry install 
    
  • 安装预提交挂钩。
    pre-commit install
    

添加您的代码

做出你的代码贡献。确保记录并添加新功能的测试。要自动发布到 pypi,请增加版本号并推送到 master。见下文。

整理你的代码

  • 运行所有测试
  • 运行预提交
    pre-commit run
    

发布

创建拉取请求

增加版本号

合并的拉取请求仅在具有新版本号的情况下才会发布到 pypi。要碰撞 dicomtrolley 的版本,请执行以下操作。

  • dicomtrolley 使用语义版本控制检查您的添加是 PATCH、MINOR 还是 MAJOR 版本。

  • 手动增加版本号:

    • pyproject.toml->version = "0.1.2"
  • 将您的更新新版本的简短描述添加到HISTORY.md

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

dicomtrolley-2.1.6.tar.gz (35.3 kB 查看哈希

已上传 source

内置分布

dicomtrolley-2.1.6-py3-none-any.whl (38.5 kB 查看哈希

已上传 py3