圖像重採樣分爲升採樣和降採樣,但是在圖像處理中一般爲了提高效率,而進行圖像降採樣。
降採樣即爲增大圖像像素間距,可理解爲將多個像素合併爲一個像素,在圖像降採樣過程中需要設置以下幾個方面:
採樣後的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;
}