2016-07-08 485 views
0

我正在使用DCMTK作为C++项目,并且想要从dicom文件中检索像素。 我用THID基本的例子: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; 

在“做一些与像素数据有用”的部分,怎么用PixelData取出变量获得像素

+0

- 什么是包括上面的代码文件的唯一办法?我无法找到从DICOM文件读取像素数据的完整示例。有人可以帮忙吗? – Ruchir

+0

好吧,明白了。这是dcmimage.h – Ruchir

回答

1

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

但是,它强烈依赖于您认为“有用”的东西,无论getOutputData()是您选择的方法。这是因为getOutputData()实际上是一种渲染方法。假设你有一个典型的CT,MR或CR图像,灰度范围已经被重新调整为8位。

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

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

使用这种方法显然是更多的努力,但对任何超越渲染的像素数据,它是保留了原始灰度值

+0

非常感谢您的解释,我只有一个问题,我想知道如何访问DcmElement,比方说,我想要使用此示例获取图像高度:DcmElement元素; MyDataset-> findAndGetElement(tagOfRows,element);与元素变量,我可以得到标记,虚拟机,虚拟机..但我不知道如何获取元素的值(在这种情况下,高度) –

+0

有访问DcmDataset属性值的类型安全的方法。它们以模式findAndGet 命名,在您的情况下:MyDataset-> findAndGetUint16(tagOfRows,&<无符号整数变量>)。他们并不总是按预期行事。 findAndGetString适用于几乎所有的数据类型,但是会将字符串转换为适合您的类型。 –

+0

@kritzel_sw你是什么意思?“他们并不总是按预期行事。”?由于我是DCMTK开发人员之一,因此我对意外情况感兴趣。 –