Slicer5.7.0导入DICOM反向或失败的源码修改

本博客记录自己的查错流程,需要直接解决问题可以跳转 [省流]

问题描述

使用 Slicer 5.7.0 加载部分 DICOM 数据时会加载失败,加载失败的形式为:

加载失败的图像

但是同样的数据在 5.6.2 版本中不会出现。

并且在 DICOM 数据库中,右键显示元数据,数据本身也是正常的:

元数据正常

解决过程

变换矩阵

在 data 列表中,发现有一个多余的变换 transform 存在,删除该变换后,DICOM 数据正常打开,但是是反向的。

创建新的变换,可以编辑变换矩阵,将反向方向修改为 -1

在这里插入图片描述

再在切片视图中去重置视场,可以看到数据正向了:

数据正向

但是修复后的数据,如果进行 AI 计算肺血管等操作,却出现了错位的情况:

错位情况

修改源码

上一个方法只能解决表面问题,并不能真正解决 DICOM 导入的问题,所以还需要研究源码来探究出现问题的地方。

思路是根据 5.6.2 与 5.7.0 的源码差距进行比对,寻找涉及 Dicomorientedgridtransform 的修改,因为错误是 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); 后面就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值