Как читать двоичные данные из файла dicom? - PullRequest
1 голос
/ 17 февраля 2020

Как прочитать необработанные данные изображения из несжатого файла DICOM и выгрузить его в файл. Я просто использую следующий код для сжатых файлов. использование библиотеки dcmtk

dataSet->findAndGetElement(DCM_PixelData, element);
pixDataElem = OFstatic_cast(DcmPixelData*, element);

DcmPixelSequence *pixelSequence = NULL;
E_TransferSyntax tran_Syntax = EXS_Unknown;
const DcmRepresentationParameter *representation = NULL;

// Find the key that is needed to access the right representation of the data within DCMTK
pixDataElem->getOriginalRepresentationKey(tran_Syntax, representation);
//pixDataElem->getCurrentRepresentationKey(tran_Syntax, representation);

// Access original data representation and get result within pixel sequence
pixDataElem->getEncapsulatedRepresentation(tran_Syntax, representation, pixelSequence);


    DcmPixelItem *pixelItem = NULL;
    //Access the First frame by skipping the offset table...
    pixelSequence->getItem(pixelItem, 1);

    Uint8 *pixels = NULL;
    pixDataElem = (DcmPixelData*)pixelItem;
    pixDataElem->getUint8Array(pixels);
    Uint8 *pixels = NULL;
    pixDataElem->getUint8Array(pixels);
    //Writing the Raw data to a file...
    FILE *file;
    file = fopen("D:\\DicomImage.jpeg", "wb");
    fwrite(pixels, sizeof(char), imageSize, file);
    cout << "File write Completed and the File is closed Successfully" << endl;

Как можно получить данные изображений из несжатых файлов с множеством кадров в c ++ с использованием библиотеки dcmtk .....?

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

В принципе, вы можете использовать тот же код, но без сжатия (на самом деле это более простой случай ...)

dataSet->findAndGetElement(DCM_PixelData, element);
pixDataElem = OFstatic_cast(DcmPixelData*, element);

Uint8 *pixels = NULL;
pixDataElem->getUint8Array(pixels);

//Writing the Raw data to a file...
FILE *file;
file = fopen("D:\\DicomImage.raw", "wb");
// frameSize is the size of a single frame
fwrite(pixels + frameSize * frameIndex, sizeof(char), frameSize, file);
cout << "File write Completed and the File is closed Successfully" << endl;

(это не в моей голове, поэтому нет гарантии полноты)
То, что вы получаете, это необработанные двоичные данные. Если вы хотите создать файл изображения, такой как JPG, вам потребуется соответствующая функциональность изображения, хотя это не имеет ничего общего с dcmtk.

0 голосов
/ 17 февраля 2020

Если вы знаете, что изображения не сжаты, то вы можете получить доступ к необработанным данным первого кадра следующим образом: Imebra :

imebra::DataSet loadedDataSet = imebra::CodecFactory::Load("pathToFileName);

size_t imageWidth = loadedDataSet.getUint32(imebra::TagId(imebra::tagId_t::Columns_0028_0011), 0);
size_t imageHeight = loadedDataSet.getUint32(imebra::TagId(imebra::tagId_t::Rows_0028_0010), 0);
size_t channels = loadedDataSet.getUint32(imebra::TagId(imebra::tagId_t::SamplesPerPixel_0028_0002), 0);
size_t allocatedBits = loadedDataSet.getUint32(imebra::TagId(imebra::tagId_t::BitsAllocated_0028_0100), 0);
size_t totalSizeBytes = (imageWidth * imageHeight * allocatedBits * channels + 7) / 8;

ReadingDataHandlerNumeric rawData = loadedDataSet.getReadingDataHandlerNumeric(TagId(PixelData_7FE0_0010), 0);

size_t dataSize(0);
const char* pMemory = rawData.data(&dataSize);
// Now pMemory points to the raw data, dataSize holds the memory size

Если вам нужен второй кадр или изображения сжимаются, тогда вы должны использовать imebra :: DataSet :: getImage () и позволить imebra найти нужную область памяти и распаковать изображение для вас.

Обратите внимание, что последовательные несжатые изображения не выровнены по границе байта но первый бит второго кадра может быть в том же байте, который содержит последний бит первого кадра. Для сжатых изображений вам, возможно, придется иметь дело с таблицей смещений, указывающей на буферы, содержащие изображения.

Отказ от ответственности: я являюсь автором Imebra.

...