计算机系统:Win8.1 (64 bit)
ITK:4.7.2 (64bit)
1 问题描述
本人使用ITK进行CT序列图像的分割,使用的是3D区域生长法。由于总体序列图像的容量比较大,因此希望通过对这些序列图像进行分组分割,从而节约计算机内存。在分组的时候,前面的组的序列图像张数是一样的,只有最后一组序列图像的的数量可能会比前面组要少。
当所有组的序列图像的张数一样时,分割过程并没有出现错误;但是,当最后一组序列图像数目少于前面的组别的时候,就发生了一下错误:
itk::InvalidRequestedRegionError (00000083A57FF308)
Location: "void __cdecl itk::DataObject::PropagateRequestedRegion(void)"
File: E:\ITK\InsightToolkit-4.7.2\Modules\Core\Common\src\itkDataObject.cxx
Line: 393
Description: Requested region is (at least partially) outside the largest possible region.
2 错误分析
上面的错误是由itk::SeriesWriter引起的。由于第一次调用itk::SeriesWriter时设定了序列图像的范围(假如:0~100,共101张图像)。在循环过程中,就算改变序列图像的索引起始和结束值(例如:100~200,共101张图像),只要其范围没有变,是不会出现上述错误的;然而,当将序列图像索引的范围变化时(例如:200~250,共51张图像),将会引发上述问题。
根据第1章问题描述中红色字体的错误信息的最后一行提示:所请求的区域不在最大可能的范围之内!因此可以猜测,在第一次设定序列图像索引的同时,也设定了最大允许请求范围,而再次改变索引范围时,这个最大允许请求范围并没有同步改变。
3 解决方法根据第2章的分析,我们需要做的就是在改变索引范围的同时,也要改变其最大允许请求范围。方法就是在调用itk::SeriesWriter:Update()之前,先调用下面的函数:
itk::SeriesWriter::UpdateLargestPossibleRegion()如果itkSeriesWriter的输入对象有这个函数,也应该在调用itkSeriesWriter:Update()之前先调用,例如图像类型转换器itk::CastImageFilter。
4 拓展
itk::SeriesWriter的设置也同理。
参考资料
[1]SphinxExamples/src/Core/Common/ReRunPipelineWithChangingLargestPossibleRegion/Code.cxx