ResampleImageFilter는 좌표 변환을 통해 영상을 리샘플링하기 위해 자주 사용되는 필터 클래스입니다.
Description
클래스 선언부는 아래와 같습니다.
template<typename TInputImage, typename TOutputImage,
typename TInterpolatorPrecisionType = double,
typename TTransformPrecisionType = TInterpolatorPrecisionType>
class itk::ResampleImageFilter< TInputImage, TOutputImage,
TInterpolatorPrecisionType, TTransformPrecisionType >
- 기본적으로 Filter 클래스는 itkImageToImage 를 상속받아 구현되었으므로, ResampleImageFilter 역시 사용할 때 InputImage type 과 OutputImage type을 지정해 줍니다.
- ResampleImageFilter는 자주 사용되기는 하지만, 연산하는 데 시간이 다소 걸릴 수 있습니다. itk에는 다양한 필터가 있으므로, 가능하다면 특정 기능에 특화된 필터를 사용하는 것이 좋습니다.
- 일반적으로 사용되는 affine transform뿐 아니라 deformation transform도 적용할 수 있습니다.
예제코드
예제코드는 영상 사이즈를 1/4 크기로 줄여보았습니다.
#include <iostream>
#include <itkImage.h>
#include <itkResampleImageFilter.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkMetaImageIOFactory.h>
#include <itkAffineTransform.h>
using namespace std;
int main()
{
constexpr unsigned int Dimension = 3;
using InputPixelType = short;
using OutputPixelType = short;
using InputImageType = itk::Image<InputPixelType, Dimension>;
using OutputImageType = itk::Image<OutputPixelType, Dimension>;
using ReaderType = itk::ImageFileReader<InputImageType>;
using WriterType = itk::ImageFileWriter<OutputImageType>;
using FilterType = itk::ResampleImageFilter<InputImageType, OutputImageType>;
using TransformType = itk::AffineTransform<double, Dimension>;
itk::MetaImageIOFactory::RegisterOneFactory();
try{
// Read meta image data
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("abdominal.mha");
reader->Update();
InputImageType::Pointer img = reader->GetOutput();
img->DisconnectPipeline();
img.Print(cout);
// Resample Iamge Filter
FilterType::Pointer filter = FilterType::New();
filter->SetInput(img);
OutputImageType::SizeType size;
size[0] = size[1] = 256;
size[2] = img->GetLargestPossibleRegion().GetSize()[2];
OutputImageType::SpacingType spacing = img->GetSpacing();
OutputImageType::PointType origin = img->GetOrigin();
OutputImageType::DirectionType direction = img->GetDirection();
// Affine Transform - translation & scale
TransformType::Pointer transform = TransformType::New();
TransformType::OutputVectorType translation;
translation[0] = -(origin[0]/2); // X translation in millimeters
translation[1] = -(origin[1]/2); // Y translation in millimeters
transform->Translate(translation);
TransformType::OutputVectorType scale;
scale[0] = 2.0;
scale[1] = 2.0;
scale[2] = 1.0;
transform->Scale(scale);
filter->SetSize(size);
filter->SetOutputSpacing(spacing);
filter->SetOutputOrigin(origin);
filter->SetOutputDirection(direction);
filter->SetTransform(transform);
filter->SetDefaultPixelValue(-1000);
// Write meta image data
WriterType::Pointer writer = WriterType::New();
writer->SetFileName("output.mha");
writer->SetInput(filter->GetOutput());
writer->Write();
}
catch(itk::ExceptionObject &ex)
{
std::cerr << ex.what();
}
return 0;
}
실행결과
ResampleImageFilter에 대해 이해하는 데 도움이 되길 바라며, 위 예제에서 transform만 조정하여 보았습니다. Slicer3D를 통해 영상을 Overlay 하였으며, 배경은 Input 영상이고 왼쪽 상단의 1/4로 축소된 영상이 Output 영상입니다.
|
|
Translation & Scale 조정 | 조정 X |
|
|
Transform만 조정 | Scale만 조정 |