3d Slicer-DICOM模块之Query/Retrieve功能介绍

本文详细介绍了3dSlicer中的DICOM模块,特别是Query/Retrieve功能,用于通过DICOM协议进行医学影像数据的网络传输。3dSlicer不仅支持DICOM格式,还能加载NRRD, STL, JSON等非dcm格式。通过Query/Retrieve,用户可以使用DICOM的findscu和movescu/getscu命令查询和获取数据。在3dSlicer中,SearchOptions对应DICOM的特定标签,如Patient's Name、Study Description等。作者通过阅读源码解析了SearchOptions的对应关系,帮助用户更有效地进行数据检索。

本文由Markdown语法编辑器编辑完成。

1. DICOM模块

3d Slicer作为医学影像的开源处理软件,当然离不开医学影像数据。
DICOM模块,就是专门负责DICOM影像的查找,获取,发送和接收的模块。

官方文档中关于DICOM的描述,见链接: https://slicer.readthedocs.io/en/latest/user_guide/modules/dicom.html
在这里插入图片描述
上述图像介绍了,3d Slicer加载医学影像的流程。
3d Slicer既支持加载DICOM影像数据,也支持加载非dcm数据,如NRRD, STL, JSON等格式的数据。
除了本地加载影像文件外,DICOM协议支持通过网络传输影像。也就是如上图中,红色框内的: DICOM query/retrieve。

2. Query/Retrieve功能介绍

Query/Retrieve功能,对应的是dicom协议中的findscu和movescu/getscu.

功能dcmtk指令
Queryfindscu
Retrievemovescu/getscu

在3d Slicer的DICOM页面中,有一个项目是: DICOM networking, 就是提供通过网络来进行DICOM影像传输的功能入口。
在这里插入图片描述
点击: "Query and retrieve"按钮,即可以进入如下的弹出页面。
页面中显示了,3d Slicer默认的AE Title为: “CTKSTORE”。
下面则是配置需要连接的PACS服务器的信息。
由于我已经在本地用dcm4chee搭建了一个PACS服务器。PACS服务器的AE Title是: DCM4CHEE,
Address是:192.168.109.83,Port是11112,且支持通过CGET的方式获取数据。
在这里插入图片描述
右侧的红框 Search Options, 就是通过一些已知的Patient/Study/Series的信息,来从PACS的服务器检索相关的数据。检索选择框下方的两列,看起来比较明显。一列是日期,另一列是Modality。
但是上方的 Name/Study/Series/ID, 就不是很明显。不知道应该输入什么信息,也不知道应该以什么样的格式来输入。
在Google上检索了很多关于3d Slicer的query/retrieve的文章,但都是关于如何利用下面的日期和Modality来query数据的,对于上面的Name/Study/Series/ID, 却没有介绍。

最后实在没有办法了。只能通过查询3d Slicer的源码来寻找有价值的信息了。
由于3d Slicer是一个持续了20多年的开源项目,因此代码量是相当庞大的。如何在如此庞大的代码量前面迅速地定位相关代码,也没有更好的办法。我只能是通过将代码加载在Visual Studio Code里面,然后利用编辑器自带的搜索功能,来搜索了。

我用的关键字是搜索框上方的"Search Options"。首先是在源码里面搜索,结果没有搜到任何信息。后来想到,3d Slicer在编译的过程中,同时还下载和编译了十几个项目的代码。因此,我又在3d Slicer bulid的目录下查找,结果真的找到了。

最后定位到的文件是位于3d Slicer的编译目录: Slicer-SuperBuild-Debug下的:
CTK/Libs/DICOM/Core/ctkDICOMQuery.cpp的函数: ctkDICOMQuery:query()中的Line 324 ~ 380.

  /* Now, for all keys that the user provided for filtering on STUDY level,
   * overwrite empty keys with value. For now, only Patient's Name, Patient ID,
   * Study Description, Modalities in Study, and Study Date are used.
   */
  QString seriesDescription;
  foreach( QString key, d->Filters.keys() )
    {
    if ( key == QString("Name") && !d->Filters[key].toString().isEmpty())
      {
      // make the filter a wildcard in dicom style
      d->Query->putAndInsertString( DCM_PatientName,
        (QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
      }
    else if ( key == QString("Study") && !d->Filters[key].toString().isEmpty())
      {
      // make the filter a wildcard in dicom style
      d->Query->putAndInsertString( DCM_StudyDescription,
        (QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
      }
    else if ( key == QString("ID") && !d->Filters[key].toString().isEmpty())
      {
      // make the filter a wildcard in dicom style
      d->Query->putAndInsertString( DCM_PatientID,
        (QString("*") + d->Filters[key].toString() + QString("*")).toLatin1().data());
      }
    else if ( key == QString("Modalities") && !d->Filters[key].toString().isEmpty())
      {
      // make the filter be an "OR" of modalities using backslash (dicom-style)
      QString modalitySearch("");
      foreach (const QString& modality, d->Filters[key].toStringList())
      {
        modalitySearch += modality + QString("\\");
      }
      modalitySearch.chop(1); // remove final backslash
      logger.debug("modalityInStudySearch " + modalitySearch);
      d->Query->putAndInsertString( DCM_ModalitiesInStudy, modalitySearch.toLatin1().data() );
      }
    // Rememer Series Description for later series query if we go through the keys now
    else if ( key == QString("Series") && !d->Filters[key].toString().isEmpty())
      {
      // make the filter a wildcard in dicom style
      seriesDescription = "*" + d->Filters[key].toString() + "*";
      }
    else
      {
      logger.debug("Ignoring unknown search key: " + key);
      }
    }

  if ( d->Filters.keys().contains("StartDate") && d->Filters.keys().contains("EndDate") )
    {
    QString dateRange = d->Filters["StartDate"].toString() +
                        QString("-") +
                        d->Filters["EndDate"].toString();
    d->Query->putAndInsertString ( DCM_StudyDate, dateRange.toLatin1().data() );
    logger.debug("Query on study date " + dateRange);
    }

正如这段代码的注释部分所描述的,3d Slicer的Search Options,目前的对应关系是:
在这里插入图片描述

Search OptionsDICOM TAG
NamePatient’s Name
StudyStudy Description
SeriesSeries Description
IDPatient ID
DateStudy Date
ModalityModalities in Study

根据以上的对应关系,便可以在Search Options的对应的Tab页输入相应的查询条件,来进行数据的检索。

完。

1引言................................................ ............................................................. ................................ 3 1.1结构............................................ ................................................. ............................................. 3 1.2支持的语言............................................... .................................................................... .......... .4 1.3使用COM对象模型的效果.......................................... ........................................................... 4 1.4 DicomObjects中的集合.............................................. .............................................................. 4 1.5 Dicom对象的DICOM数据表示........................................................................ ....................... 5 1.6解释和使用序列............................................. .......................................................................... 7 1.7私有属性............................................... .................................................................... ............... 7 2第一步 - 阅读,查看和写入DICOM文件................................................................... ............. 9 2.1您的第一个DICOM计划............................................. ............................................................. 9 2.2将映像写入磁盘............................................ ......................................................................... 10 3通过网络简单地发送和接收图像........................................ .................................................... 11 3.1发送图像.................................................. ................................................................ .............. 11 3.2接收图像............................................... ..................................................................... ............ 11 4查询/检索(SCU)........................................... .......................................................... .............. 13 4.1公共特性............................................... ................................................................... .............. 13 4.2 DoQuery ............................................... ................................................................................ . 14 4.3 GetImages ............................................... ............................................................................... 14 4.4 GetUsingMove ................................................ ........................................................................15 4.5 DoRawQuery ................................................ ...........................................................................15 4.6 MoveSync ................................................ ................................................................................15 4.7 MoveImages ................................................ ............................................................................15 4.8基于Dicom连接的Q / R方法........................................... ............................ ....... ......... ..... 15 5离线媒体............................................. ................................................. ..... ....... ........................17 5.1阅读............................................... ................................................. .......... ....... ....... ..............17 5.2创建................................................ ................................................. ....................................... 18 5.3更新............................................... ................................................. ........................................ 19 5.4乘以引用的目录记录............................................. ................................................................ 19 6打印............................................ ................................................. .............................................. 20 6.1使用DicomPrint打印.................................................. ........................................................... 20 6.2使用标准化操作打印............................................. ................................................................ 22 6.3将DICOM图像打印到Windows打印机.......................................... ..................................... 22 7将DICOM图像导出到其他格式........................................... .................................................... 23 7.1单帧............................................... ................................................. ........................................ 23 7.2多帧图像/电影........................................... ............................................................................. 23 7.3非文件导出............................................. ...................................................................... ......... 23 8高级图像审查站............................................. ........................................................................... 24 8.1基本查看控件................................................ ......................................................................... 24 8.2多帧(电影)图像.......................................... ....................................................................... 24 8.3注释............................................ ................................................. ........................................... 25 8.4查找表............................................... ................................................. .................................... 28 8.5 DICOM灰度呈现状态............................................. ................................................................ 28 8.6显示速度优化................................................ ......................................................................... 29 9网络使用............................................... ......................................................... ........................... 31 9.1在Web服务器上运行DicomObjects . .... .......................................... ................................... 31 9.2在Web客户端上运行DicomObjects .......... .... .................................. .................................. 33 10写路由器/修改器.................................. .... .... .............. ...................................................... ... 35 11编写DICOM服务器............................................. ................................................................ ... 36 11.1聆听协会的对象........................................... ........................................................................ 36 11.2验证协会............................................... ................................................................................ 37 11.3处理C-STORE操作............................................ ................................................................... 37 11.4处理查询/检索请求............................................ ................................................................. 38 11.5处理C-ECHO请求............................................ .................................................................... 42 11.6传输语法和质量问题............................................ ............................................................... 42 11.7性能和可靠性问题............................................. .................................................................. 43 11.8模态WorkList SCP .............................................. .................................................................. 44 11.9打印SCP ............................................... ................................................. .............................. 44 11.10存储承诺SCP ................................................ ..................................................................... 45 12访问和修改像素数据............................................ .................................................................. 46 12.1原始指针的语言............................................. ...................................................................... 46 12.2使用变量数组的语言............................................. .............................................................. 47 13创建DICOM图像.............................................. .................................................................. ... 48 13.1导入其他格式................................................ ....................................................................... 48 13.2导入多帧图像.................................................. ..................................................................... 49 13.3从划痕............................................... ................................................................... ............... 50 14使用模态WorkList作为SCU ........................................... ...................................................... 52 15语言特定功能.............................................. ............................................................................ 53 15.1 Visual Basic ............................................... .................................................. ......................... 53 15.2 VBScript ................................................ ................................................. .............................. 53 15.3应用程序的Visual Basic(例如MS Access)........................................ ............................. 53 15.4 Microsoft Visual C ++ ................................................ ........................................................ ... 53 15.5 Borland Delphi和Borland C ++ Builder ........................................... .................................... 55 15.6 Java ................................................ ................................................. ..................................... 56 15.7其他环境............................................... ................................................. .............................. 56 16日志记录................................................ ................................................. ................................ 57 16.1日志详细信息和级别............................................. ........................................................... .. 57 16.2文件记录............................................... ................................................. .............................. 57 16.3 DicomLog控制................................................ ...................................................................... 58 17高级使用............................................... ................................................. ................................. 59 17.1超车注册表值............................................ ........................................................................... 59 17.2更改默认SOP类的列表.......................................... ............................................................ 59 17.3传输语法选择.................................................. ..................................................................... 60 17.4私人SOP类................................................ .................................................................. ....... 61 17.5私有传输语法........................................................................................................................ 61 17.6存储承诺............................................... ............................................................................ ... 61
<think>嗯,用户遇到了3D Slicer启动时关于vtkvmtk模块的错误。错误信息显示CLI可执行文件路径有问题,进程启动失败,可能程序缺失或权限不足。用户之前询问过如何修改Qt属性相关警告,现在的新问题看起来是模块加载失败。 首先,我需要分析可能的错误原因。路径中的空格可能是个问题,比如“3D slicer”中的空格是否被正确解析。用户可能将软件安装在带有空格的路径中,这有时会导致程序无法正确识别路径。建议用户检查安装路径,尝试将软件移到没有空格的路径,比如“F:/jhy/3DSlicer”之类的。 其次,用户可能缺少VMTK扩展的依赖项。vtkvmtk模块是VMTK的一部分,需要特定运行时库,如Python包或系统DLL。需要提醒用户确认是否正确安装了VMTK扩展,并检查安装日志是否有错误。此外,重新安装扩展或更新到最新版本可能解决问题。 权限问题也可能导致此错误。尤其是在Windows系统中,如果软件安装在受保护的目录(如Program Files),可能需要以管理员权限运行3D Slicer。用户可能没有足够的权限访问相关文件,建议尝试以管理员身份启动程序。 另外,扩展的安装可能不完整或损坏。用户可能下载过程中文件损坏,或者被杀毒软件拦截。建议用户关闭杀毒软件后重新安装扩展,或者手动下载扩展包进行安装。 用户的环境变量设置也可能有问题,特别是Python环境。如果系统中有多个Python版本,可能会导致冲突。需要检查3D Slicer使用的Python路径是否包含所需依赖,并确保没有环境变量冲突。 还有可能的是,扩展与当前版本的3D Slicer不兼容。用户使用的是5.8.0版本,可能需要确认VMTK扩展是否支持该版本。建议用户查看扩展的文档或论坛,确认兼容性,并尝试降级Slicer版本或寻找兼容的扩展版本。 最后,如果上述方法都无效,建议用户收集详细日志,联系技术支持或社区论坛。提供更多上下文信息,如安装步骤、系统环境等,有助于更快定位问题。 总结下来,需要分步骤引导用户检查路径、依赖、权限、扩展完整性、环境变量和兼容性等问题。同时,保持回答结构清晰,逐步排除可能的原因,帮助用户系统地解决问题。</think>以下是针对 **3D Slicer 中 `vtkvmtk` 模块加载失败问题** 的详细排查与解决方案: --- ### **一、错误原因分析** 根据错误信息: ```plaintext [Qt] CLI executable: F:/jhy/3D slicer/Slicer 5.8.0/slicer.org/Extensions-33216/SlicerVMTK/lib/Slicer-5.8/qt-loadable-modules/vtkvmtk.py [Qt] The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program. ``` 可能的原因包括: 1. **路径问题**:路径中存在空格(如`3D slicer`)或特殊字符导致解析失败 2. **依赖缺失**:`vtkvmtk`模块依赖的库未正确安装(如VMTK运行时组件) 3. **权限不足**:对目标文件或目录无访问权限 4. **扩展损坏**:VMTK扩展安装不完整或文件损坏 --- ### **二、逐步解决方案** #### **步骤1:检查路径合法性** - **问题路径**:`F:/jhy/3D slicer/...` 中的空格可能导致命令行解析错误 - **解决方案**: 1. 将3D Slicer安装到**无空格路径**(例如:`F:/jhy/3DSlicer`) 2. 重新安装VMTK扩展 #### **步骤2:验证VMTK扩展完整性** 1. **检查扩展安装**: - 打开3D Slicer → `View` → `Extension Manager` - 在`Installed Extensions`中确认`SlicerVMTK`状态为`Enabled` - 若状态异常,点击`Uninstall`后重新安装 2. **手动安装扩展**(若网络安装失败): - 从[官方扩展库](https://extensions.slicer.org/)下载`SlicerVMTK`离线包 - 通过`Extension Manager` → `Install from File` 导入 #### **步骤3:修复权限问题** - **Windows系统**: 1. 右键3D Slicer快捷方式 → `以管理员身份运行` 2. 检查目标目录权限: ```bash # 查看目录权限(命令提示符) icacls "F:\jhy\3D slicer\Slicer 5.8.0" ``` 3. 若权限不足,运行: ```bash icacls "F:\jhy\3D slicer\Slicer 5.8.0" /grant Users:(F) ``` #### **步骤4:检查依赖库** 1. **确认VMTK依赖**: - VMTK需要`Python`科学计算库(如`numpy`、`scipy`) -3D Slicer的Python控制台中运行: ```python import vmtk # 若报错,提示缺失的库 ``` 2. **安装缺失库**: - 使用3D Slicer内置的`pip`: ```bash # 在Slicer的终端中执行 ./python.exe -m pip install numpy scipy ``` #### **步骤5:清理缓存文件** 1. 删除旧配置: - **Windows**:删除 `C:\Users\<用户名>\AppData\Roaming\NA-MIC\Slicer 5.8.0` - **macOS/Linux**:删除 `~/.config/NA-MIC/Slicer 5.8.0` 2. 重启3D Slicer --- ### **三、高级调试方法** #### **方法1:查看详细日志** 1. 启动3D Slicer时添加调试参数: ```bash ./Slicer --verbose-modules ``` 2. 检查输出中与`vtkvmtk`相关的加载错误细节 #### **方法2:手动测试CLI可执行文件** 1. 在终端中直接运行问题路径中的Python脚本: ```bash cd "F:/jhy/3D slicer/Slicer 5.8.0/slicer.org/Extensions-33216/SlicerVMTK/lib/Slicer-5.8/qt-loadable-modules" ./Slicer --python-script vtkvmtk.py ``` 2. 观察输出错误(如缺失的DLL或Python包) --- ### **四、替代方案** 若问题持续存在: 1. **使用Docker镜像**: ```bash docker pull slicer/slicer:5.8 docker run -it slicer/slicer:5.8 ``` 2. **尝试旧版本**: - 下载3D Slicer 5.6.x + VMTK 1.4.x(已知稳定组合) --- ### **五、关键注意事项** | 风险点 | 规避建议 | |-------------------------|-----------------------------------| | 路径空格导致解析失败 | 始终使用无空格安装路径 | | 杀毒软件拦截 | 临时禁用杀软后安装 | | Python环境冲突 | 使用Slicer内置Python而非系统环境 | --- 如果问题仍未解决,请提供以下信息以进一步排查: 1. 操作系统版本(如Windows 11 22H2) 2. 3D Slicer完整日志(通过`--verbose-modules`生成) 3. 运行`vtkvmtk.py`的手动测试结果
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inter_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值