You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

AMI.js加载DICOM序列矢状/冠状视图切片显示异常求助

解决AMI.js矢状面/冠状面仅渲染对应轴面切片数的问题

我之前在使用AMI.js处理轴面采集的DICOM序列时,也碰到过一模一样的问题——轴面显示全147张切片没问题,但矢状面和冠状面就卡在147张,没法渲染出完整的体数据视图。结合当时的排查经验,给你几个针对性的解决方向:

1. 先确认DICOM元数据的完整性和准确性

AMI计算多平面重建(MPR)的维度完全依赖DICOM里的空间定位元数据,比如ImagePositionPatientImageOrientationPatientPixelSpacing。如果这些参数缺失、不连续或者有误,AMI就会 fallback 到原始轴面的切片数来计算其他平面,导致渲染不完整。

你可以在加载完序列后,打印这些参数检查:

console.log('Image Position:', stack.imagePositionPatient);
console.log('Image Orientation:', stack.imageOrientationPatient);
console.log('Pixel Spacing:', stack.pixelSpacing);

重点看每个切片的ImagePositionPatient是否是连续递增的,确保体数据的空间位置是完整的立方体结构。

2. 手动指定MPR视图的维度

如果自动计算失效,咱们可以手动推导矢状面和冠状面应该有的切片数,然后显式设置给视图:

// 假设已经加载好stack对象
// 矢状面切片数 = 原始数据左右方向的总长度 / 矢状面的像素间距
const sagitalSliceCount = Math.floor(stack.dimensions[0] * stack.spacing[0] / stack.spacing[1]);
// 创建矢状面Volume并设置正确维度
const sagitalVolume = new AMI.Volume(stack);
sagitalVolume.setDimensions([sagitalSliceCount, stack.dimensions[1], stack.dimensions[2]]);

// 冠状面同理,切片数基于原始数据前后方向的总长度计算
const coronalSliceCount = Math.floor(stack.dimensions[1] * stack.spacing[1] / stack.spacing[0]);
const coronalVolume = new AMI.Volume(stack);
coronalVolume.setDimensions([stack.dimensions[0], coronalSliceCount, stack.dimensions[2]]);

这里的核心是根据体数据的实际空间尺寸,而非原始轴面的切片数,来推导其他平面的合理切片数量。

3. 确保MPR的重建范围覆盖整个体数据

有时候AMI默认的重建范围被限制在了原始轴面的边界内,导致部分切片被“隐藏”了。你可以把全局边界赋值给MPR视图:

// 获取整个体数据的边界范围
const globalBounds = stack.bounds;
// 为矢状面和冠状面设置完整边界
sagitalVolume.bounds = globalBounds;
coronalVolume.bounds = globalBounds;

这样就能让AMI知道需要渲染整个体数据的所有切片,而不是只限于原始轴面的切片范围。

4. 检查渲染视口的裁剪设置

还有一种可能是渲染器的视口尺寸太小,把超出轴面切片数的部分给裁剪掉了。你可以让渲染器自动适配体数据的尺寸:

const renderer = new AMI.Renderer(yourCanvasElement);
// 适配矢状面
renderer.fitToVolume(sagitalVolume);
// 或者手动设置视口尺寸
renderer.viewport.width = sagitalSliceCount * stack.spacing[1];
renderer.viewport.height = stack.dimensions[1] * stack.spacing[2];

最后建议你打印出stack.dimensionsstack.spacing以及各MPR视图的dimensions值对比一下——正常情况下,矢状面的切片数应该对应原始数据宽度方向的像素数(按间距换算后),冠状面则对应高度方向的像素数,这样就能快速定位哪里出了问题。

内容的提问来源于stack exchange,提问作者AdLeu

火山引擎 最新活动