本博客记录自己的查错流程,需要直接解决问题可以跳转 [省流]
问题描述
使用 Slicer 5.7.0 加载部分 DICOM 数据时会加载失败,加载失败的形式为:
但是同样的数据在 5.6.2 版本中不会出现。
并且在 DICOM 数据库中,右键显示元数据,数据本身也是正常的:
解决过程
变换矩阵
在 data 列表中,发现有一个多余的变换 transform 存在,删除该变换后,DICOM 数据正常打开,但是是反向的。
创建新的变换,可以编辑变换矩阵,将反向方向修改为 -1
:
再在切片视图中去重置视场,可以看到数据正向了:
但是修复后的数据,如果进行 AI 计算肺血管等操作,却出现了错位的情况:
修改源码
上一个方法只能解决表面问题,并不能真正解决 DICOM 导入的问题,所以还需要研究源码来探究出现问题的地方。
思路是根据 5.6.2 与 5.7.0 的源码差距进行比对,寻找涉及 Dicom
、oriented
、grid
、transform
的修改,因为错误是 DICOM 导入后,有一个变换矩阵的方向错误。
追踪到发现可能不是 Slicer 源码修改带来的问题,问题应该是存在于 VTK 和 ITK 中的。
查看版本更新发现 ITK 的版本发生了变化,从 5.3.0 到 5.4.0。
涉及到了 ITK 的版本变化带来的问题,寻求社区的帮助,定位问题到 seriesReader
的方向矩阵处理。
所以修改这里就行,代码是:Slicer/Libs/vtkITK/vtkITKArchetypeImageSeriesReader.cxx
itk::OrientImageFilter<ImageType,ImageType>::Pointer orient =
itk::OrientImageFilter<ImageType,ImageType>::New();
itk::ImageSeriesReader<ImageType>::Pointer seriesReader =
itk::ImageSeriesReader<ImageType>::New();
seriesReader->SetFileNames(this->FileNames);
seriesReader->SetImageIO(imageIO);
seriesReader->SetForceOrthogonalDirection(false); // 添加此句
if (this->UseNativeCoordinateOrientation)
{
filter = seriesReader;
}
省流
添加语句:
seriesReader->SetForceOrthogonalDirection(false);
到文件:
Slicer/Libs/vtkITK/vtkITKArchetypeImageSeriesReader.cxx
的第 684 行 seriesReader->SetImageIO(imageIO);
后面就行。