ITK等分辨率重采样CT数据

使用CT数据模拟超声成像时需要对CT数据进行三个方向的等分辨率重采样,平滑组织边界。

using FilterType = itk::ResampleImageFilter<InputImageType, InputImageType>;
FilterType::Pointer filter = FilterType::New();
filter->SetInput(image);
filter->SetDefaultPixelValue(0);

//设置变换
using TransformType = itk::AffineTransform<double, 3>;
TransformType::Pointer transform = TransformType::New();
filter->SetTransform(transform);

//设置插值器
using InterpolatorType = itk::NearestNeighborInterpolateImageFunction<InputImageType, double>;
InterpolatorType::Pointer interpolator = InterpolatorType::New();
filter->SetInterpolator(interpolator);

InputImageType::SizeType new_size;
//new_size保证原始的尺寸不变
new_size[0] = old_size[0];     // 512
new_size[1] = old_size[1];     // 512
new_size[2] = old_size[2] * old_spacing[2] / old_spacing[0];    //  145*3/0.857422=507 
filter->SetSize(new_size);

//三个方向等分辨率
InputImageType::SpacingType new_spacing;
new_spacing[0] = old_spacing[0];    //0.857422
new_spacing[1] = old_spacing[1];    //0.857422
new_spacing[2] = old_spacing[0];    //0.857422
filter->SetOutputSpacing(new_spacing);

filter->SetOutputOrigin(old_origin);

filter->Update();

InputImageType::ConstPointer inputImage = filter->GetOutput();
InputImageType::RegionType region = inputImage->GetLargestPossibleRegion();
InputImageType::IndexType start = region.GetIndex();
InputImageType::SizeType size = region.GetSize();

constexpr unsigned int OutputDimension = 2;
using Image2DType = itk::Image<OutputPixelType, OutputDimension>;

using SeriesWriterType = itk::ImageSeriesWriter<InputImageType, Image2DType>;
SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New();
seriesWriter->SetInput(filter->GetOutput());
seriesWriter->SetImageIO(gdcmIO);
	
using OutputNamesGeneratorType = itk::NumericSeriesFileNames;
OutputNamesGeneratorType::Pointer OutputNameGenerator = OutputNamesGeneratorType::New();
//每个切片文件名的模板format
string format = output_name;
format += "\\%03d.dcm";
OutputNameGenerator->SetSeriesFormat(format.c_str());		//设置输出文件名的模板

const unsigned int firstSlice = start[2];
const unsigned int lastSlice = start[2] + size[2] - 1;
OutputNameGenerator->SetStartIndex(firstSlice);
OutputNameGenerator->SetEndIndex(lastSlice);
OutputNameGenerator->SetIncrementIndex(1);
seriesWriter->SetFileNames(OutputNameGenerator->GetFileNames());

	try
	{
		std::cout << "Writing image: " << output_name << std::endl;
		seriesWriter->Update();
	}
	catch (const itk::ExceptionObject& err)
	{
		std::cerr << "ERROR: ExceptionObject caught !" << std::endl;
		std::cerr << err << std::endl;
	}
	return EXIT_SUCCESS;

原始序列:

插值后:

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值