Как я могу преобразовать изображение RAW в изображение DICOM, используя imebra? - PullRequest
0 голосов
/ 20 марта 2020

Я новичок в imebra и хочу конвертировать необработанное изображение в изображение DICOM. Я собрал библиотеку imebra для своей виртуальной машины (Ubuntu 16.04) и следовал руководству с веб-сайта. Я обнаружил, что они не показывают, как конвертировать необработанное изображение в изображение DICOM.

Кто-нибудь может мне помочь или подсказать процесс конвертации?

#include <imebra/imebra.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <memory>

using namespace std;
int main()
{   

    //creat read stream  
    using namespace puntoexe;
    ptr<stream> readStream(new stream);
    readStream->openFile(NSStringToStringW(imagePath), std::ios::in);


    // Create dataset
    streamReader reader =new streamReader(readStream);
    imebra::dataSet testDataSet = imebra::codecs::codecFactory::getCodecFactory()->load(reader);

    // Set Tags
    testSet->setString(0x0010,0,0x0010,0,"testSrt0");
    testSet->setString(0x0010,0,0x0010,1,"testSrt1");

    // Load jpeg
    std::unique_ptr<imebra::DataSet> testSet(imebra::CodeFcactory::load("/home/lixingyu/care.raw"));

    // Save as DICOM
    imebra::CodecFactory::save(testSet, "/home/lixingyu/care.dcm", imebra::codecType_t::dicom);
    */
    return 0;
}

Я не уверен, что код выше. Что-то не так с этим процессом? Когда я попробовал этот код: using namespace puntoexe; произошла ошибка:

"ошибка: 'puntoexe' не является именем пространства имен" и "ptr" также был ошибкой.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вы используете довольно старую версию Imebra.

С Imebra 4 и 5 вы можете:

  • создать объект изображения
  • заполнить объект изображения с необработанными данными
  • создать набор данных DICOM
  • добавить изображение в набор данных DICOM
  • заполнить все необходимые теги DICOM (например, класс sop, экземпляр, имя пациента и т. д. *) 1025 *)
  • сохранить набор данных DICOM

В коде с Imebra5:

include <imebra/imebra.h>

// Create an image 500 pixels wide, 400 pixels height,
// each sample is a 16 bit unsigned value, the colorspace
// is monochrome_2, the higher bit used is 15
imebra::MutableImage image(500, 400, imebra::bitDepth_t::depthU16, "MONOCHROME2", 15);

// We fill the image with data
{
    // We use a writing data handler to write into the image.
    // The data is committed into the image only when the writing
    // data handler goes out of scope.
    imebra::WritingDataHandlerNumeric writeIntoImage(image.getWritingDataHandler());

    for(size_t y(0); y != 400; ++y)
    {
        for(size_t x(0); x != 500; ++x)
        {
            // This method is slow, you can access directly the memory
            // with writeIntoImage.assign() or getMemory()
            writeIntoImage.setUnsignedLong(y * 500 + x, pixelValue);
        }
    }
}

// We specify the transfer syntax and the charset
imebra::charsetsList_t charsets;
charsets.push_back("ISO 2022 IR 6");
imebra::MutableDataSet dataSet("1.2.840.10008.1.2.1", charsets);

// Add the image to the dataset
dataSet.setImage(0, image,  imebra::imageQuality_t::veryHigh);

// Set the patient name
dataSet.setUnicodePatientName(imebra::TagId(imebra::tagId_t::PatientName_0010_0010), imebra::UnicodePatientName(L"Patient^Name", "", ""));

// Save to a file
imebra::CodecFactory::save(dataSet, "dicomFile.dcm", imebra::codecType_t::dicom);

Код Imebra 4 аналогичен, но функции возвращают указатели вместо объектов .

Отказ от ответственности: я автор Imebra

0 голосов
/ 20 марта 2020

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

EDIT : при дальнейшем исследовании похоже, что вы используете старый учебник. puntoexe::ptr больше не используется и должен быть заменен стандартными умными указателями.

// Load jpeg
std::unique_ptr<imebra::Dataset> 
testDataset(imebra::CodecFactory::load("/path/to/jpegfile.jpg"));

// Save as Dicom
imebra::CodecFactory::save(testDataset, "/path/to/file.dcm", 
imebra::codecType_t::dicom);
...