2016-07-08 155 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開發人員之一,因此我對意外情況感興趣。 –