无法从 ITK Resample Image filter 运行基本示例代码

问题描述

编辑:开始 进行以下代码更改后问题解决。我想对相关 ITK 提出一般性评论的额外请求 诸如“请求区域”、何时调用 Update() 以及何时调用 UpdateLargestPossibleRegion() 等概念。

filter->SetInput(reader->Getoutput());
InputimageType::SizeType size;
size[0] = 300;
size[1] = 300;
filter->SetSize(size);
filter->UpdateLargestPossibleRegion();

编辑:结束

使用 ITK v5.2。

基本的重采样过滤器示例失败。
错误:“请求的区域(至少部分)在最大可能区域之外。”

下面的代码基本上是ResampleImageFilter.cxx的清理版本。
它在最后一条语句失败:

writer->Update()

输入图像 BrainProtonDensitySlice.png 的大小为 217x181。
通过调用在过滤器中设置的指定输出大小为 300x300:

filter->SetSize().

我错过了什么?过滤器输出大小和输入图像大小可以不同,对吗?

任何帮助将不胜感激。

        #include "itkResampleImageFilter.h"
        #include "itkAffineTransform.h"
        #include "itkNearestNeighborInterpolateImageFunction.h"

        #include "itkImage.h"
        #include "itkImageFileReader.h"
        #include "itkImageFileWriter.h"

        #include "itkPNGImageIO.h"


        // image dim and object types
        constexpr unsigned int Dimension = 2;
        using InputPixelType = unsigned char;
        using OutputPixelType = unsigned char;
        using InputimageType = itk::Image<InputPixelType,Dimension>;
        using OutputimageType = itk::Image<OutputPixelType,Dimension>;
        using FilterType = itk::ResampleImageFilter<InputimageType,OutputimageType>;
        using TransformType = itk::AffineTransform<double,Dimension>;
        using InterpolatorType = itk::NearestNeighborInterpolateImageFunction<InputimageType,double>;

        //create filter
        auto filter = FilterType::New();

        auto transform = TransformType::New();
        transform->SetIdentity();
        filter->SetTransform(transform);

        auto interpolator = InterpolatorType::New();
        filter->SetInterpolator(interpolator);

        filter->SetDefaultPixelValue(0); //values outside the extent of input image

        const double spacing[Dimension] = { 1.0,1.0 };
        filter->SetoutputSpacing(spacing);

        const double origin[Dimension] = { 0.0,0.0 };
        filter->SetoutputOrigin(origin);

        InputimageType::DirectionType direction;
        direction.SetIdentity();
        filter->SetoutputDirection(direction);



        // set image input 
        auto imageIOTypePNG = itk::PNGImageIO::New();

        using ReaderType = itk::ImageFileReader<InputimageType>;
        using WriterType = itk::ImageFileWriter<OutputimageType>;

        auto reader = ReaderType::New();
        reader->SetimageIO(imageIOTypePNG);
        reader->SetFileName(<input_image_path>);

        auto writer = WriterType::New();
        writer->SetimageIO(imageIOTypePNG);
        writer->SetFileName(<output_image_path>);

        InputimageType::SizeType size;
        size[0] = 300;
        size[1] = 300;
        filter->SetSize(size);

        // connect input reader,filter and writer
        filter->SetInput(reader->Getoutput());
        writer->SetInput(filter->Getoutput());

        //default output: exampleAction = 0
        writer->Update();

解决方法

filter->Update(); 之前添加 writer->Update(); 可以避免崩溃。

运行 ResampleImageFilter.cxx 示例有效(次要 argument count comparison bug 除外)。也许 SetImageIO 会以某种方式干扰管道更新?如果是这样,请将其报告为 bug

旁注:您不需要显式指定 IO,除非您想使用 IO 的特殊功能。