메뉴 닫기

itk::ResampleImageFilter – 영상 리샘플링

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만 조정

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다