跳到主要内容

元数据提供者

关于包级别的架构以及 5.x 当前的元数据行为,见 元数据模块。

医学影像通常带有大量非像素级的元数据,例如影像的像素间距、患者 ID, 或者扫描采集日期。对某些文件类型(例如 DICOM)来说,这些信息存放在文件头里, 可以被读取、解析并在你的应用中传递。对另一些类型(例如 JPEG、PNG)来说, 这些信息需要独立于实际像素数据另行提供。不过即便是 DICOM 影像, 应用开发者也常常把元数据与像素数据分开、从服务端独立传给客户端—— 因为这样能显著提升性能。

元数据提供者是一个 JavaScript 函数,充当访问 Cornerstone 中影像相关元数据的接口。 使用者可以定义自己的提供者函数,为每一张特定影像返回他们想要的任何元数据。 元数据提供者函数具有如下原型:

function metadataProvider(type: string, ...queries: any): any

不过通常来说,提供者实现的是下面这个更简单的原型:

function metadataProvider(type: string, imageId: string): Record<string, any>

这是因为大多数元数据是针对 ImageId 提供的, 但 Cornerstone 同时也为「针对任何信息定义和使用元数据提供者」提供了基础设施。

元数据的类型​

传给元数据提供者的 type 参数可以是任意字符串。你可以用任意 type 调用 cornerstone.metaData.get(),只要有任何一个元数据提供者能为给定的 imageId 提供该 type,你就能拿到响应。举例来说,你可以借此轻松地提供应用专属的信息, 例如金标准(ground truth)或患者信息。

Cornerstone 的 core 和 tools 也会自动为所显示的影像请求各类元数据。 标准元数据模块的清单见 API 参考的 MetadataModules 一节。 其中许多模块遵循 DICOM 标准。如果你想在 自定义元数据提供者中实现它们, 最省事的办法是参考某个既有元数据提供者是怎么实现的,例如 WADOURI 元数据提供者。

元数据提供者的优先级​

由于可以注册多个元数据提供者,添加提供者时可以为它指定一个优先级数值。 到了需要请求元数据的时候,Cornerstone 会按提供者的优先级顺序为该 imageId 请求元数据(如果某个提供者对该 imageId 返回 undefined, Cornerstone 就转向下一个提供者)。

举例来说,如果 provider1 以优先级 10 注册、provider2 以优先级 100 注册, 那么该 imageId 的元数据会先问 provider2。

提供计算型元数据​

有少数几个元数据提供者,或者存放运行期间被更新 / 修改过的元数据信息, 或者把既有元数据转换成其他格式,或者提供静态元数据。

临时性元数据​

标定后的像素间距​

calibratedPixelSpacingMetadataProvider 允许存放标定元数据的覆盖值, 使用户或系统能够在不改动原始元数据的前提下,为某张影像补充间距标定信息。

计算型元数据​

有些元数据可以基于系统中已有的其他元数据计算出来。例如 adapters 模块可以基于 既有的默认元数据提供者,生成 dcmjs 的「Normalized」格式的 study 模块信息。

我们建议:凡是仅从原始 DICOM 数据计算得出、但经过某种方式改造的元数据, 都使用计算型元数据提供者。这个模式使得我们可以对各种不同形态的底层数据 (多帧实例、已格式化的数据、或用于产出新实例的数据) 统一地创建标准的计算型改造。

referencedMetadataProvider​

adapters 模块提供 referenced 元数据,在基于某个既有模块创建新实例时很有用。 它同时也提供 Part 10 前缀头以及被引用对象所需的常量。

Study、Series、Instance 数据​

这些数据模块以 dcmjs 的「Normal」格式提供 study 级或 series 级信息, 不包含完整的实例头,并且是基于为 WADO-URI、WADO-RS 以及 OHIF 所定义的那些底层标准模块得出的。

Part 10 常量​

dcmjs 中的 part 10 _meta 字段可以写死,但那样一来, 若想改动生成出来的对象,就只能在创建之后再改对象、或者改创建代码。 Part 10 常量元数据提供了标准的 0002 头模块,供 dcmjs 在编码 DICOM 时使用。

Referenced 与 Predecessor 数据​

referenced 数据与 predecessor 序列提供者允许把 SR 或 SEQ 类序列中的默认实例 替换为一个引用了此前所用数据的新实例。

metaData 辅助方法​

metaData 服务提供了几个辅助方法,用来处理命名差异和计算结果。

getNormalized​

getNormalized 模块方法接收一组小驼峰命名版本的模块, 把它们合并成大驼峰(dcmjs 的 NormalCase)版本。它用于从非 dcmjs 数据源创建 instance 模块,也用于创建 study / series / instance 数据模块。

capitalizeTag 与 lowerTag​

在 dcmjs normalized 模块所用的大驼峰名称、与 metaData 模块所用的小驼峰名称 之间转换时,需要遵循一些特定规则。这些规则被封装成辅助函数, 可以从 CS3D core 导出的 metaData 对象上取用。