使用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;
原始序列:
插值后: