体积渐进加载
体积视口交错解码
由于对于体积视口,我们主要处理实际体积的重建视图(MPR)的渲染,理想情况下是尽可能快地获得体积的初始图像(即使是有损的)以避免渲染出灰色体积。我们可以通过交错请求来实现这一点。
交错图像适用于体积的任何编码方式。也就是说,首先获取每第 N 张图像允许以 1/N 频率显示图像。然后交错代码简单地将图像复制到缺失的位置,以在纵向方向上生成低分辨率。
然后,这种交错可以与任何图像的有损版本的离散提取结合起来——即一次性返回整个请求的非流式解码版本图像。
性能
在体积视口上使用渐进加载的性能提升因数据大小和 DICOMweb 服务器组件的能力而异。
请注意,没有任何时间包括加载解码器的时间,只是在第一次渲染时可见。这两种类型的时间是相似的。
类型 | 大小 | 网络 | 首次渲染 | 完整时间 |
---|---|---|---|---|
HTJ2K 流式传输 | 33 M | 4g | 2503 ms | 8817 ms |
HTJ2K 字节范围 | 33 M | 4g | 1002 ms | 8813 ms |
HTJ2K 字节范围非常微妙地比直接 JLS 略慢,但可以在支持 HTJ2K 和字节范围请求的任何 DICOMweb 服务器上完成。
- 4g 速度 - 30 mbit/s 下行, 5 mbit/s 上行, 10 ms 延迟
- 全尺寸图像为 512x512x174
- 降低分辨率的图像为 128x128 并有损压缩
HTJ2K 流式传输
请注意,此阶段模型将通过选择队列和请求的优先级跨不同视口交错请求以执行各种阶段。交错并不完美,因为 它是在阶段而不是单个请求之间交错,但外观效果合理,而无需复杂的逻辑在体积之间工作。
如在高级检索配置中所学,我们可以利用decimate
、offset
和不同的优先级来实现交错。
抽取是每N
张图像在F
偏移处的选择,描述为N/F
,例如4/3
位置为3,7,11,...
这是通过按顺序检索以下阶段完成的:
- 初始图像 - 位置为 0, 50%, 100% 处的图像
- 使用 multipleFast 检索类型的 4/3 图像抽取
- 一旦完成,将以较低分辨率显示完整体积
- 使用 multipleFast 检索类型的 4/1 图像抽取
- 使用两倍的分辨率更新初始体积
- 使用 multipleFinal 进行 4/2 和 4/0 图像抽取
- 用全分辨率图像替换复制图像
- 使用 multipleFinal 进行 4/3 和 4/1 抽取
- 用全分辨率图像替换低分辨率图像
配置如下所示:
stages: [
{
id: 'initialImages',
// positions 选择特定位置 - 中间图像,第一和最后
positions: [0.5, 0, -1],
// 使用这些的默认渲染类型,应该检索全分辨率
retrieveType: 'default',
// 使用交互队列
requestType: RequestType.INTERACTION,
// 优先级 10,首先执行
priority: 10,
// 从此数据填充附近的帧
nearbyFrames: {....},
},
{
id: 'quarterThumb',
decimate: 4,
offset: 3,
retrieveType: 'multipleFast',
priority: 9,
nearbyFrames,
},
... 其他版本
// 用最终数据替换初始 数据
{
id: 'finalFull',
decimate: 4,
offset: 3,
priority: 4,
retrieveType: 'multipleFinal',
},
],
- 初始显示图像,以全分辨率显示(第一个和最后一个)
- 首先每第 4 张图像
initialByteRange
字节获取
- 获取字节范围 [0,64000]
- 立即显示部分分辨率版本
- 使用部分分辨率版本显示附近切片
- 其他步骤
- 这里还有其他部分和全分辨率视图来填充数据
- 获取剩余数据(不要重新获取原始数据)
- 用完整数据替换第 2 步中的低分辨率数据
HTJ2K 字节范围
体积渐进加载扩展了基本堆栈加载,具备交错各种图像的能力,从降低分辨率版本内和图像间进行插值。也就是说,单个图像可能最初以 1/4 大小(对于 CT 为 256x256)检索,然后仅最初显示的图像加上每第 4 张图像,其它图像进行插值。在这种情况下,使用复制插值来最小化插值开销。最后,在获取有损的初始版本后,获取其余图像。
默认检索顺序如下,其中 Decimate 描述为包含图像间隔和该集合中的偏移量。
- 初始图像,全分辨率
- Decimate 4/3 部分分辨率
- 插值图像 -2...+1(最近邻居)
- Decimate 4/1 部分分辨率
- Decimate 4/2 全分辨率
- Decimate 4/4 全分辨率
- Decimate 4/3 全分辨率
- Decimate 4/1 全分辨率
如果未配置部分分辨率,则执行相同的顺序,只是最后两个阶段不会运行,因为部分分辨率已加载这些。这确实允许结果的插值非常快地出现。