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

You*_*chi 3 c++ dicom dcmtk

我正在将 DCMTK 用于 C++ 项目,并希望从 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;
Run Code Online (Sandbox Code Playgroud)

在“对像素数据做一些有用的事情”部分中,如何使用 PixelData 变量来获取像素

kri*_*_sw 6

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

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

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

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

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