ITK:未能正确调整图像大小

时间:2015-07-29 15:52:20

标签: c++ image-processing itk

我对ITK很新,在尝试调整图像大小时遇到​​了麻烦。我觉得我正在遵循示例代码(ResampleImageFilter),但我一直得到一个输出图像,据报道其“总质量”为零,当写入磁盘时,会产生一个图像,具有适当的大小(outputSize),但完全空白。

非常感谢任何帮助。 感谢

typedef unsigned char               PixelType;
typedef itk::Image<PixelType, 2>    ImageType;

...

ImageType::Pointer resize(ImageType::Pointer image, ImageType::SizeType inputSize, ImageType::SizeType outputSize){
    ImageType::SpacingType outputSpacing;
    outputSpacing[0] = image->GetSpacing()[0] * (static_cast<double>(inputSize[0]) / static_cast<double>(outputSize[0]));
    outputSpacing[1] = image->GetSpacing()[1] * (static_cast<double>(inputSize[1]) / static_cast<double>(outputSize[1]));

    typedef itk::IdentityTransform<double, 2> TransformType;
    typedef itk::ResampleImageFilter<ImageType, ImageType> ResampleImageFilterType;

    ResampleImageFilterType::Pointer resample = ResampleImageFilterType::New();
    resample->SetInput(image);
    resample->SetSize(outputSize);
    resample->SetOutputSpacing(outputSpacing);
    resample->SetTransform(TransformType::New());
    resample->Update();
    resample->UpdateOutputInformation();

    return resample->GetOutput();
}

...

movingImage = resize(croppedImage, cropped_img_size, img_size);
  

@note:

     

cropped_img_size == [1251,787]

     

img_size == [1251,814]

编辑:

工作版本:

typedef unsigned char               PixelType;
typedef itk::Image<PixelType, 2>    ImageType;

...

ImageType::Pointerresize(ImageType::Pointer image, ImageType::Pointer referenceImage){
    ImageType::SizeType inputSize  = image->GetLargestPossibleRegion().GetSize();
    ImageType::SizeType outputSize = referenceImage->GetLargestPossibleRegion().GetSize();

    ImageType::SpacingType outputSpacing;
    outputSpacing[0] = image->GetSpacing()[0] * (static_cast<double>(inputSize[0]) / static_cast<double>(outputSize[0]));
    outputSpacing[1] = image->GetSpacing()[1] * (static_cast<double>(inputSize[1]) / static_cast<double>(outputSize[1]));

    typedef itk::IdentityTransform <double, 2>              TransformType;
    typedef itk::ResampleImageFilter<ImageType, ImageType>  ResampleImageFilterType;

    ResampleImageFilterType::Pointer resample = ResampleImageFilterType::New();
    resample->SetInput(image);
    resample->SetOutputParametersFromImage(referenceImage);
    resample->SetSize(outputSize);
    resample->SetOutputSpacing(outputSpacing);
    resample->SetTransform(TransformType::New());
    resample->UpdateOutputInformation();
    resample->Update();

    return resample->GetOutput();
}

...

movingImage = resize(croppedImage, fixedImage);

1 个答案:

答案 0 :(得分:3)

你的术语&#34;调整大小&#34;查看ITK ResampleImageFilter不是正确的概念。调整大小意味着简单的像素到像素操作。 ITK图像的基本概念是它具有由以下内容定义的物理位置:原点,间距和方向矩阵。 ResampleImageFilter将输入图像的物理空间中的几何变换应用于ResampleImageFiler的输出参数定义的输出图像的物理空间。

您忘记设置&#34; OutputOrigin&#34;和&#34; OutputDirection&#34;。或者,您可以调用&#34; SetOutputParametersFromImage&#34;,然后只需设置不同的参数,例如&#34; OutputSpacing&#34;。