DCMTK C++:如何从 dicom 文件中获取数据像素

DCMTK C++ : how to get data pixels from dicom files

我正在为 C++ 项目使用 DCMTK,并希望从 dicom 文件中检索像素。 我使用了这个基本示例:

          DicomImage *image = new DicomImage("test.dcm");
          if (image != NULL)
          {
           if (image->getStatus() == EIS_Normal)
          {
            if (image->isMonochrome())
                 {
                     image->setMinMaxWindow();
                     Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 /* bits */));
                    if (pixelData != NULL)
                    {
                    /* do something useful with the pixel data */
                    }
                      }
                  } else
           cerr << "Error: cannot load DICOM image (" <<        DicomImage::getString(image->getStatus()) << ")" << endl;
          }
          delete image;

在 "do something useful with the pixel data" 部分,如何使用 pixelData 变量获取像素

首先:您已经拥有作为无符号字符数组的像素数据。例如,您可以将它们转换为 8 位单色位图并将它们显示在屏幕上。你需要构造位图的高度和宽度可以从DicomImage对象中获取

但是,getOutputData() 是否是您选择的方法在很大程度上取决于您的考虑 "something useful"。这是因为 getOutputData() 实际上是一种渲染方法。假设您有一张典型的 CT、MR 或 CR 图像,灰度范围已重新调整为 8 位。

您可能更喜欢在全灰度范围内提取像素数据并采用您自己的渲染和处理方法。在这种情况下,我建议您使用 getInterData() ,其中 returns 具有完整灰度范围的内部存储像素数据。模态 LUT 已应用于中间数据,因此您得到的是一组值的封装 (class DiPixel),每个值都对设备测量的灰度值进行编码(例如,在 CT 的情况下为亨斯菲尔德单位) .

DiPixel returns 这些灰度作为空指针。要正确处理这些值,您需要确定它们的表示形式(例如 Uint8、Sint16 等)。

使用这种方法显然更费力,但对于超出渲染像素数据的任何内容,它是唯一保留原始灰度值的方法