DICOM Доступ к сжатым данным (DCMTK)

Я борюсь с библиотекой DCMTK 3.6.1, и теперь я заблокирован в общей ситуации: доступ к пикселю сжатых данных изображения DICOM.

Как предлагают авторы библиотеки здесь http://support.dcmtk.org/redmine/projects/dcmtk/wiki/Howto_AccessingCompressedData, это правильный способ получить данные сжатия.

Этот код работает, но они начинаются с файла для создания набора данных.
В моем коде мой набор данных заполнен таким образом

status = data->putAndInsertUint8Array(DCM_PixelData, pSource, sizeBuffer);

где pSource содержит мои несжатые данные пикселей. После этого я добавляю теги Image DICOM (группа 28) и делаю сжатие с помощью

status = data->chooseRepresentation(EXS_JPEGProcess14SV1, &param);

и, начиная с этого набора данных, я хочу получить доступ к сжатым данным

status = data->findAndGetElement(DCM_PixelData, element);
DcmPixelData *dpix = NULL;
dpix = OFstatic_cast(DcmPixelData*, element);
/* Since we have compressed data, we must utilize DcmPixelSequence
in order to access it in raw format, e. g. for decompressing it
with an external library.
*/
DcmPixelSequence *dseq = NULL;
E_TransferSyntax xferSyntax = EXS_Unknown;
const DcmRepresentationParameter *rep = NULL;
// Find the key that is needed to access the right representation of the data within DCMTK
dpix->getOriginalRepresentationKey(xferSyntax, rep);

// Access original data representation and get result within pixel sequence
status = dpix->getEncapsulatedRepresentation(xferSyntax, rep, dseq);
Uint32 length;
if (status.good())
{
DcmPixelItem* pixitem = NULL;
// Access first frame (skipping offset table)
dseq->getItem(pixitem, 1);
if (pixitem == NULL)
return 1;
Uint8* pixData = NULL;
// Get the length of this pixel item (i.e. fragment, i.e. most of the time, the lenght of the frame)
length = pixitem->getLength();
if (length == 0)
return 1;
// Finally, get the compressed data for this pixel item
status = pixitem->getUint8Array(pixData);
// Metto i Pixel Data compressi su pSorgCompr
pSorgCompr = (LPBYTE)pixData;
}
////////////////////////////

DJEncoderRegistration::cleanup();
DJDecoderRegistration::cleanup();

но ряд status = dpix-> getEncapsulatedRepresentation (xferSyntax, rep, dseq); Повторите СБОЙ с ошибкой «Пиксельное представление не найдено», и я не понимаю, почему.

странная вещь если перед доступом к сжатым данным я сохраню сжатый файл с fileformat.saveFile («ressedPixelData.dcm », EXS_JPEGProcess14SV1); и затем я загружаю файл с result = fileformat.loadFile («ressedPixelData.dcm «);, все работает отлично

Это как функция loadfile решить проблему, я не знаю, как, может быть, заполнение некоторых тегов?

Теги, которые я заполняю перед вызовом функции chooseRepresentation:

  • DCM_Rows
  • DCM_Columns
  • DCM_BitsStored
  • DCM_SamplesPerPixel
  • DCM_PlanarConfiguration
  • DCM_HighBit
  • DCM_BitsAllocated
  • DCM_PixelRepresentation
  • DCM_RescaleIntercept
  • DCM_RescaleSlope
  • DCM_PhotometricInterpretation
  • DCM_PixelAspectRatio
  • DCM_ImagerPixelSpacing
  • DCM_PixelSpacing

3

Решение

Ну может у меня решена эта проблема. Я добавил istructions

dataset->removeAllButCurrentRepresentations();

перед доступом к сжатым данным пикселей.

Я тоже могу сделать
PixelData->removeAllButCurrentRepresentations(); вместо инструкции до и так же работает ….

Но я действительно не понимаю, почему это работает …. не могли бы вы попытаться объяснить?
Спасибо

0

Другие решения

В DICOM сжатые кадры сохраняются не так, как несжатые (собственные) кадры в элементе данных пикселей (7FE0, 0010). Вот основная концепция кодирования сжатых изображений в DICOM.

Инкапсулированный поток пикселей (сжатые данные изображения) сегментируется на один или несколько фрагментов (элементов) в элементе данных пикселей (7FE0, 0010) набора данных верхнего уровня. В инкапсулированном кодировании элемент данных пикселя является последовательностью и содержит два или более элементов элемента (фрагментов), причем каждый фрагмент (элемент элемента) имеет свою собственную явную длину. Кроме того, инкапсулированный формат поддерживает как однокадровое, так и многокадровое кодирование изображений. Кадр может целиком содержаться в одном фрагменте (элементе) или может охватывать несколько фрагментов. Последовательность фрагментов потока инкапсулированных пикселей заканчивается разделителем.
Первый элемент (FFFE, E000) в последовательности элементов перед закодированным потоком данных пикселей обычно пуст или может содержать элемент таблицы базовых смещений, который содержит смещения байтов в первый байт тега элемента первого фрагмента для каждого кадра в последовательности предметов.

Поэтому, когда вы хотите извлечь сжатый поток пикселей из набора данных DICOM, вам нужно пропустить первый элемент Item в последовательности данных пикселей. Я надеюсь, что это поможет понять документацию, на которую вы ссылаетесь. Пожалуйста, обратитесь к стандарту DICOM PS 3.5 Приложение A для получения дополнительной информации.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector