如何解决无法从 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 的特殊功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。