ITK-圖像重採樣

圖像重採樣分爲升採樣和降採樣,但是在圖像處理中一般爲了提高效率,而進行圖像降採樣。

降採樣即爲增大圖像像素間距,可理解爲將多個像素合併爲一個像素,在圖像降採樣過程中需要設置以下幾個方面:

採樣後的spacing

採樣後的圖像大小

採樣過程中的插值算法

////頭文件
#include "itkImageFileReader.h"
#include "itkAffineTransform.h"
#include "itkResampleImageFilter.h"

typedef itk::Image<short,3> ITKImageType; //圖像類型:
typedef typename ITKImageType::Pointer     ITKImagePointer; //定於圖像指針
typedef typename ITKImageType::SizeType SizeType;  //定義圖像尺寸類型
typedef typename ITKImageType::PixelType PixelType;  //定義圖像像素灰度值類型
typedef typename ITKImageType::PointType PoingType;  //定義圖像像素物理位置類型
typedef typename ITKImageType::IndexType IndexType;  //定義圖像像素索引值類型
typedef typename ITKImageType::DirectionType DirectionType; //定義圖像的方向類型
typedef itk::Matrix< double, 4, 4 > MatrixType;
int main()
{
	 ////讀取圖像
    typedef itk::ImageFilterReader<ITKImageType> ImageReaderType;
    ImageReaderType::Pointer imagereaderFilter = ImageReaderType::New();
    imagereaderFilter ->SetFileName(“input.nrrd”);
    try
	{
		 imagereaderFilter ->Update();
	}
	catch (itk::ExceptionObject & exp)
	{
		cerr << "read Exception caught !" << std::endl;
		cerr << exp << std::endl;
	}
   
    ITKImagePointer input = imagereaderFilter ->GetOutput();//輸出的圖像
    //得到原始圖像的spacing
    SpacingType originspacing = input->GetSpacing(); 
    //得到原始圖像的大小
    SizeType size = nput->GetlargestPossibleregion().GetSize();
    //設置重採樣的spacing;
	SpacingType spacingresample;
	spacingresample[0] = 0.5;
	spacingresample[1] = 0.5;
	spacingresample[2] = 1;
    //計算重採樣後圖像的大小
	SizeType sizesample;
	sizesample[0] = size[0]*originspacing[0]/spacingresample[0];
	sizesample[1] = size[1]*originspacing[1]/spacingresample[1];
	sizesample[2] = size[2]*originspacing[2]/spacingresample[2];

    typedef itk::ResampleImageFilter<ITKImageType, ITKImageType> ResampleImageFilterType;
	ResampleImageFilterType::Pointer resampleFilter = ResampleImageFilterType::New();
	resampleFilter->SetInput(scaleresampleFilter->GetOutput());
	typedef itk::NearestNeighborInterpolateImageFunction<ITKImageType, double> InterpolatorType;
	InterpolatorType::Pointer interpolator = InterpolatorType::New();
	resampleFilter->SetInterpolator(interpolator);  //設置插值算法
	resampleFilter->SetDefaultPixelValue(0);     
	resampleFilter->SetOutputSpacing(spacingresample);
	resampleFilter->SetSize(sizesample);   
	resampleFilter->SetOutputOrigin(scaleresampleFilter->GetOutput()->GetOrigin());
	resampleFilter->SetOutputDirection(scaleresampleFilter->GetOutput()->GetDirection());
	try
	{
		resampleFilter->Update();
	}
	catch (itk::ExceptionObject & exp)
	{
		cerr << "重採樣出錯!" << std::endl;
		cerr << exp << std::endl;
	}

	return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章