首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GDCM逐片写入体素数据?

如何使用GDCM逐片写入体素数据?
EN

Stack Overflow用户
提问于 2021-06-03 06:16:03
回答 1查看 35关注 0票数 1

在我见过的关于如何写入图像数据的所有GDCM示例中,他们总是将图像卷视为一个整体,内聚的缓冲区。基本结构是这样的:

代码语言:javascript
复制
#include "gdcmImage.h"
#include "gdcmImageWriter.h"
#include "gdcmFileDerivation.h"
#include "gdcmUIDGenerator.h"

int write_image(...)
{
  size_t width = ..., height = ..., depth = ...;
  auto im = new gdcm::Image;

  std::vector<...> buffer;
  auto p = buffer.data();

  im->SetNumberOfDimensions(3);
  im->SetDimension(0, width);
  im->SetDimension(1, height);
  im->SetDimension(1, depth);

  im->GetPixelFormat().SetSamplesPerPixel(...);
  im->SetPhotometricInterpretation( gdcm::PhotometricInterpretation::... );

  unsigned long l = im->GetBufferLength();
  if( l != width * height * depth * sizeof(...) ){ return SOME_ERROR; }
  gdcm::DataElement pixeldata( gdcm::Tag(0x7fe0,0x0010) );
  pixeldata.SetByteValue( buffer.data(), buffer.size()*sizeof(*buffer.data()) );
  im->SetDataElement( pixeldata );

  gdcm::UIDGenerator uid;
  auto file = new gdcm::File;

  gdcm::FileDerivation fd;
  const char UID[] = ...;
  fd.AddReference( ReferencedSOPClassUID, uid.Generate() );
  fd.SetFile( *file );
  // If all Code Value are ok the filter will execute properly
  if( !fd.Derive() ){ return SOME_ERROR; }

  gdcm::ImageWriter w;
  w.SetImage( *im );
  w.SetFile( fd.GetFile() );

  // Set the filename:
  w.SetFileName( "some_image.dcm" );
  if( !w.Write() ){ return SOME_ERROR; }

  return 0;
}

我使用这种方法面临的问题是,如果正在制作额外的副本,我需要存储的图像数据量很容易超过可用的系统内存;具体地说,这些是4096×4096×2048个体素的体积,每个体素12位,所以内存中大约有48G的数据。

但是,使用gdcm::DataElementgdcm::Image::SetDataElement的方法显然会在buffer中创建数据的完整副本,这是很麻烦的。首先,我的成像系统产生的数据并不是作为内聚的、单一的值块驻留在内存中;它被分成多个切片。并且数据总量只适合正在使用一次的系统的内存。

对我来说,一片一片地读取数据是微不足道的,这将显著减少内存需求。然而,我不知所措,GDCM该如何做到这一点。

EN

回答 1

Stack Overflow用户

发布于 2021-06-03 22:16:14

您是否检查了gdcm::FileStreamer:

  • http://gdcm.sourceforge.net/3.0/html/classgdcm_1_1FileStreamer.xhtml

请参阅位于以下位置的典型设置:

该示例展示了如何创建内存不足的私有元素,但您也可以对公共DataElement执行相同的操作。

一个更复杂的阅读像素数据块写入位置的例子是:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67813194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档