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

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

本文关键字:文件 获取 数据 像素 dicom C++ DCMTK      更新时间:2023-10-16

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

          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;

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

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

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

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

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

使用这种方法显然需要更多的努力,但对于渲染像素数据以外的任何方法,它是唯一保留原始灰度值的方法