2016-07-08 11 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(), который возвращает внутренне сохраненные пиксельные данные с полным диапазоном оттенков серого. Модульная LUT применяется к промежуточным данным, поэтому вы получаете инкапсуляцию (класс DiPixel) массива значений, каждый из которых кодирует значение оттенков серого, измеренное устройством (например, единицы Hounsfield в случае CT).

DiPixel возвращает эти оттенки серого как указатель пустоты. Чтобы правильно обрабатывать значения, вам необходимо определить их репрезентацию (например, Uint8, Sint16, ...).

Используя этот подход, очевидно, больше усилий, но все, что выходит за рамки визуализации данных пикселя, это единственный подход, который сохраняет исходные значения серого

+0

Большое спасибо за ваше объяснение. У меня есть еще один вопрос: я хочу, чтобы я мог получить доступ к DcmElement, скажем, например, я хочу получить высоту изображения с помощью этого примера: элемент DcmElement; MyDataset-> findAndGetElement (tagOfRows, элемент); с переменной элемента, я могу получить тег, VR, VM .. но я не знаю, как получить значение элемента (в этом случае высота) –

+0

Существуют типы безопасных методов доступа к значениям атрибутов в DcmDataset. Они названы после шаблона findAndGet , в вашем случае: MyDataset-> findAndGetUint16 (tagOfRows, & ). Они не всегда ведут себя так, как ожидалось. findAndGetString работает почти для всех типов данных, но ставит бремя преобразовать строку в полезный тип. –

+0

@kritzel_sw Что вы подразумеваете под «Они не всегда ведут себя так, как ожидалось»? Поскольку я один из разработчиков DCMTK, меня бы интересовало, что неожиданно. –