Генерация простого изображения CT DICOM с использованием GDCM

Мне нужно сгенерировать серию изображений CT DICOM (512×512, MONOCHROME), используя GDCM библиотека. Из-за структуры приложения, над которым я работаю, для меня идеально подойдет отдельная подготовка. gdcm::Image а также gdcm::File экземпляры для каждого изображения и в конце передать их gdcmImageWriter с использованием SetFile() а также SetImage() методы.

gdcmImageWriter::write() не в состоянии писать изображения DICOM. Я уже посмотрел на исходный код VTKGDCMImageWriter класс и этот пример GDCM для подсказок. Похоже, что проблема возникает из-за несовместимости между gdcm::Image а также gdcm::File экземпляры (например, оба класса содержат информацию о Фотометрическая интерпретация изображения DICOM), который я передаю gdcmImageWriter, но я не уверен точно, что это.

Следующий упрощенный код C ++ воспроизводит полученную ошибку:

#include <gdcmFile.h>
#include <gdcmImage.h>
#include <gdcmTag.h>
#include "gdcmDataElement.h"#include "gdcmByteValue.h"#include "gdcmPixelFormat.h"#include "gdcmImageWriter.h"#include "gdcmAnonymizer.h"
#include <iostream>
#include <string>

InitializeGDCMImage(gdcm::Image*  imagePtr);
InitializeGDCMFile( gdcm::File*   filePtr );
WriteFile( gdcm::Image* imagePtr , gdcm::File* filePtr , std::string  fileName );

int main()
{
std::string  fileName = "./TEST.dcm";

// Will be deleted by gdcm::writer.
gdcm::Image* imagePtr = new gdcm::Image;
gdcm::File*  filePtr  = new gdcm::File;

InitializeGDCMImage(imagePtr);

InitializeGDCMFile( filePtr );

WriteFile( imagePtr , filePtr , fileName );

return 0;
}

где,

void WriteFile( gdcm::Image* imagePtr , gdcm::File* filePtr , std::string fileName )
{
gdcm::ImageWriter* writer = new gdcm::ImageWriter;
writer->SetFileName(  fileName.c_str() );
writer->SetImage(    *imagePtr         );
writer->SetFile(     *filePtr          );
if( !writer->Write() ){
std::cerr << "ERROR: Could not write to \"" << fileName <<  "\"" << std::endl;
}
delete writer;
}

WriteFile() наборы gdcm::File а также gdcm::Image и вызывает write(),
InitializeGDCMFile() изменяет несколько тегов DICOM, используя gdcm::Anonymizer, а также InitializeGDCMImage() устанавливает фактические значения пикселей (здесь пропущено для краткости).

void InitializeGDCMFile( gdcm::File* origianlFilePtr )
{
gdcm::File* filePtr = new gdcm::File;
gdcm::Anonymizer anon;
anon.SetFile( *filePtr );

anon.Replace( gdcm::Tag(0x0028,0x0002) , "1" );                       //SamplesperPixel
anon.Replace( gdcm::Tag(0x0028,0x0004) , "MONOCHROME2" );             //PhotometricInterpretation
anon.Replace( gdcm::Tag(0x0028,0x0010) , "512" );                     //Rows
anon.Replace( gdcm::Tag(0x0028,0x0011) , "512" );                     //Columns
anon.Replace( gdcm::Tag(0x0028,0x0030) , "0.781\\0.781" );            //PixelSpacing

anon.Replace( gdcm::Tag(0x0028,0x1050) , "0" );                        //WindowCenter
anon.Replace( gdcm::Tag(0x0028,0x1051) , "100" );                      //WindowWidth
anon.Replace( gdcm::Tag(0x0028,0x1052) , "0" );                        //RescaleIntercept
anon.Replace( gdcm::Tag(0x0028,0x1053) , "1" );                        //RescaleSlope

*origianlFilePtr = *filePtr;
}void InitializeGDCMImage(gdcm::Image* imagePtr)
{
imagePtr->SetPhotometricInterpretation( gdcm::PhotometricInterpretation::MONOCHROME2 );

imagePtr->SetNumberOfDimensions(2);
unsigned int dims[2]={512,512};
imagePtr->SetDimensions( dims );

imagePtr->SetSpacing( 0 , 1. );
imagePtr->SetSpacing( 1 , 1. );

imagePtr->SetIntercept(0.);
imagePtr->SetSlope(1.);

double dirCos[6]={1.,0.,0.,0.,1.,0.};
imagePtr->SetDirectionCosines( dirCos );

char *buffer = new char[512*512*sizeof(int16_t)];
imagePtr->SetPixelFormat( gdcm::PixelFormat::INT16 );
imagePtr->GetDataElement().SetByteValue( buffer , 512*512*sizeof(int16_t) );
imagePtr->GetPixelFormat().SetSamplesPerPixel(1);
delete[] buffer;
}

1

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]