如何高效地创建SimpleITK图像?



我有两个很长的std::向量m1m2。要创建两个SimpleITK图像,我现在这样做:

sitk::PixelIDValueEnum pixelType = sitk::sitkUInt8;
sitk::PixelIDValueEnum pixelTypeFloat = sitk::sitkFloat32;
std::vector<unsigned int> imageSize{d0, d1, l_size};
sitk::Image sitk_m1( imageSize, pixelType );
sitk::Image sitk_m2( imageSize, pixelTypeFloat );
for(unsigned int i=0;i<l_size;i++)
{
for(unsigned int j=0;j<d1;j++)
{
for(unsigned int k=0;k<d0;k++)
{
sitk_m1.SetPixelAsUInt8({j,k,i}, m1[d0*d1*i + (j*d1+k)]);
sitk_m2.SetPixelAsFloat({j,k,i}, m2[d0*d1*i + (j*d1+k)]);
}
}
}

我怎样才能更有效地做这件事?这是有效的,但需要大约10秒的接近。

使用SimpleITK的ImageImportFilter

这里有一个简单的例子来说明它是如何工作的:

std::vector<unsigned int> imageDims{4, 4000, 4000};
std::vector<unsigned char> m1(4000*4000*4, 0);
sitk::ImportImageFilter importer;
importer.SetSize( imageDims );
importer.SetBufferAsUInt8( m1.data() );
sitk::Image sitk_m1 = importer.Execute();

看看你的代码,看起来你在重新排序循环中的维度。我的例子没有做到这一点。它简单地将std::vector数据复制到Image的像素缓冲区中。要交换图像轴,使用SimpleITK的FlipImageFilter。

最新更新