在 DICOM 服务器中搜索元数据

Searching a DICOM server for metadata

我想搜索 DICOM 服务器。例如,如果用户输入要搜索的患者 ID,那么我的应用程序会使用与该 ID 相关的所有元数据填充 table,例如 ID、姓名、登录号 e.tc。如果 dicom 服务器中存在研究 ID,如何使用 dcm4chee 套件完成此操作。 –

您可以使用 dcm4che3 工具 dcm4che-tool-findscu。此代码向您展示如何针对 PACS(或任何将 C-FIND 实现为 SCP)执行 C-FIND。

FindSCU.java 非常清楚,花点时间,不要错过通过 Apache Commons CLI 代码来理解来自控制台的输入。大多数 CLI 管理代码不在此项目中,但您可以在 dcm4che3 工具 dcm4che-tool-common 项目中找到它,org.dcm4che3.tool.common.CLIUtils.java class.

考虑以下注意事项:

  • 指定Query/Retrieve的搜索级别。您可以使用多个搜索级别来将属性匹配到 PACS 中。如果您查看 FindSCU.java 的 260:265 行,您会发现您可以管理四个不同的级别:PATIENT|STUDY|SERIES|IMAGE。这将指示 C-FIND SCP 如何搜索匹配的属性。
  • 告诉C-FIND SCP你想要检索什么属性。如果您想搜索要稍后检索的研究,则必须请求 0020, 000D Study InstanceUID 标签。
    • 当然,添加您要填充的所有属性 table。
  • 使用检索到的0020, 000D Study InstanceUID标签值进行C-GET/C-MOVE操作。

您可以看到如何配置属性键以将 C-FIND SCU 执行到 CLIUtils.java class 中,它是 dcm4che3 工具的一部分 dcm4che-tool-common 项目。参见 CLIUtils.addAttributes(Attributes, String[])

希望对您有所帮助!

编辑

由于您评论说您正在使用 dcm4che2 并且您已经有了 DicomObject 搜索结果,如果您想从此 DicomObject 获取元数据,您必须先解析它,使用 DicomInputStream,然后你可以使用 BasiDicomObject 中的 getXXXX(Tag),像这样:

DicomObject dcmObj;
DicomInputStream dis = null;
dis = new DicomInputStream(file);
dcmObj = dis.readDicomObject();
String someVar = dcmObj.getString(Tag.SeriesInstanceUID);

请记住,有些属性在序列内部,因此您必须先搜索它。

您也可以查看 dcm4che-tool-dcm2txt,您会看到 Dcm2Txt.java 并且在第 170 行等处,有如何解析整个 dicom 对象。

如果您需要一些关于 DICOM 网络协议的一般描述,您可以阅读“Understanding DICOM with Orthanc" guide, and more specifically the section about C-Find.