通过 WADO、MINT、RAD69 和 DICOM-QR 检索医学图像
项目描述
双控手推车
通过 WADO、MINT、RAD69 和 DICOM-QR 检索医学图像
- 需要 python 3.7、3.8 或 3.9
- 用途
pydicom
和pynetdicom
。图像和查询结果是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)
如果您想更好地控制特定于后端的选项,您可以使用特定于后端的查询,例如MintQuery或DICOMQuery。然后查询需要匹配后端:
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 使用诗歌进行依赖和包管理
添加您的代码
做出你的代码贡献。确保记录并添加新功能的测试。要自动发布到 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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5c9b56c3ca007d7f6809d6803539ca52d51a2c08ef7cf580a90a5d0ccf256aa3 |
|
MD5 | 1bd03417c7969284979c18627f78ed7b |
|
布莱克2-256 | 5e39017b07c2d655f735ec736a6b78db7ecab2e04c47b514246b08b11205b6b6 |