[Dcmlib] converting itk,vtk or any other 3D images into dicom.

Mathieu Malaterre mathieu.malaterre at kitware.com
Thu Nov 4 16:19:23 CET 2004


Jean-Michel,

	Juste au passage je vois du ITK, pourquoi tu n'utilises pas directement 
les classes itkGDCMImageIO, itkGDCMSeriesFileNames ?

Elles sont teste'es toutes les nuits.

Mathieu

jean-michel.rouet at philips.com wrote:
> Salut Mathieu, Salut la liste...
> 
> J'ai tenté quelques essais, mais ca rate quand meme pas mal.
> Ce que j'essaye de faire, c'est lire une image dicom valide, changer 
> quelques champs, lire en parallele une image vtk (ou autre), copier les 
> informations de l'une vers l'autre, et sauver le tout dans une serie 
> d'images dicom.
> 
> j'ai écrit ca, mais ca fait un peu n'importe quoi (l'image créée est 
> lisible, mais le contenu n'a rien a voir avec ce que j'attends, elle est 
> pleine de noir)! Est-ce que je fais qqchose de mal dans ce code ???
> 
> JM
> 
> #include "itkImage.h"
> #include "itkImageFileReader.h"
> #include "gdcmHeader.h"
> #include "gdcmFile.h"
> #include "gdcmUtil.h"
> 
> #define USAGE "USAGE: Input3DImage InputDicomSample OutputDirectory"
> 
> using namespace std;
> 
> const unsigned int Dimension = 3;
> 
> 
> // pixel types
> typedef short   PixelType;
> 
> //image types 
> typedef itk::Image< PixelType,  Dimension> ImageType;
> 
> // reader and writers
> typedef itk::ImageFileReader< ImageType >  ReaderType;
> 
> void gdcmwrite(const char *inputfile, const char *inputdicom, string 
> directory);
> 
> 
> int main( int argc, char * argv[] )
> {
>  
>     if (argc < 4) {
>         std::cerr << argv[0] << USAGE << std::endl;
>         return 1;
>     } 
> 
>     // save output
>     cout << "Converting image into dicom in " << argv[2] << endl;
>     gdcmwrite(argv[1], argv[2], argv[3]);
>  
>     return 0;
> }
> 
> 
> void gdcmwrite(const char *inputfile, const char *inputdicom, string 
> directory)
> {
>     // define read object and set parameters
>     ReaderType::Pointer reader = ReaderType::New();
>  
>     // get input image
>     cout << "Loading image " << inputfile << endl;
>     reader->SetFileName( inputfile );
>     reader->Update(); 
>     cout << "Image Loaded." << endl;
> 
>     ImageType::Pointer input = reader->GetOutput();
>     input->GetPixelContainer()->SetContainerManageMemory( true );
>     PixelType* imageData = input->GetPixelContainer()->GetImportPointer();
> 
>     itksys::SystemTools::ConvertToUnixSlashes( directory );
>     if (directory[directory.size()-1] != '/')
>         directory += '/';
> 
>     int sizex = input->GetLargestPossibleRegion().GetSize()[0];
>     int sizey = input->GetLargestPossibleRegion().GetSize()[1];
>     int sizez = input->GetLargestPossibleRegion().GetSize()[2];
>     float spacing[3] = 
> {input->GetSpacing()[0],input->GetSpacing()[1],input->GetSpacing()[2]};
>     float orig[3]    = {input->GetOrigin()[0], input->GetOrigin()[1], 
> input->GetOrigin()[2]};
>     int sliceSize = sizex*sizey*sizeof(PixelType);
> 
>     gdcm::Header *h1 = new gdcm::Header(inputdicom);
>     if (!h1->IsReadable()) {
>         std::cerr << "Sorry, not a Readable DICOM / ACR File" <<std::endl;
>         return;
>     }
>     else {
>         h1->ReplaceOrCreateByNumber( "TestPatient", 0x0010, 0x0010);// 
> patientName
>         h1->ReplaceOrCreateByNumber( "Nobody", 0x0032, 0x1032);// refering 
> physician
>         h1->ReplaceOrCreateByNumber( "1", 0x0028, 0x0002);// Samples per 
> pixel 1 or 3
>         h1->ReplaceOrCreateByNumber( "MONOCHROME2 ", 0x0028, 0x0004);// 
> photochromatic interpretation
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%d", 1), 0x0028, 
> 0x0008);// nbFrames
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%d", sizey), 
> 0x0028, 0x0010);// nbRows
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%d", sizex), 
> 0x0028, 0x0011);// nbCols
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%f\\%f", 
> spacing[0],spacing[1]), 0x0028, 0x0030);// pixelSpacing
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%f", spacing[2]), 
> 0x0018, 0x0050);// slice Thickness
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%f", spacing[2]), 
> 0x0018, 0x0088);// space between slices
>         h1->ReplaceOrCreateByNumber( "16", 0x0028, 0x0100);// 
> BitsAllocated 8 or 16
>         h1->ReplaceOrCreateByNumber( "12", 0x0028, 0x0101);// BitsStored  
> 8 or 12
>         h1->ReplaceOrCreateByNumber( "11", 0x0028, 0x0102);// HighBit  7 
> or 11
>         h1->ReplaceOrCreateByNumber( "1", 0x0028, 0x0103);// Pixel 
> Representation 0(unsigned) or 1(signed)
>         h1->ReplaceOrCreateByNumber( "0", 0x0028, 0x1052);// Rescale 
> Intercept
>         h1->ReplaceOrCreateByNumber( "1", 0x0028, 0x1053);// Rescale Slope
>         h1->SetImageDataSize(sliceSize);
>     }
>  
>     gdcm::File  *f1 = new gdcm::File(h1);
>  
>     for (int z=0; z<sizez; z++) {
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%g\\%g\\%g",
>  orig[0],orig[1],orig[2]+z*spacing[0]), 0x0020, 0x0032);// im pos
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%f",
>  orig[2]+z*spacing[0]), 0x0020, 0x1041);// slice location
>         h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%d",
>                                                         z+1), 0x0020, 
> 0x0013);// instance
> 
>         // f1->GetImageData();
>         uint8_t *myData = (uint8_t *) malloc(sliceSize);
>         memcpy(myData,imageData+z*sizex*sizey,sliceSize);
>         // h1->Print();
> 
>         f1->SetImageData( myData, sliceSize);
>         h1->SetImageDataSize( sliceSize );
> 
>         std::string s10 = f1->GetHeader()->GetEntryByNumber(0x7fe0, 
> 0x0010);
>         std::cout << "lgr 7fe0, 0010 " << s10 << std::endl;
> 
>  
>         char filename[512];
>         sprintf (filename, "%s/IMAGE_%05d.dcm", directory.c_str(), z);
>         std::cout << "Writing file " << filename;
>         f1->WriteDcmExplVR(filename);
>         std::cout << " OK" << std::endl;
>         cout << "DataSize: " << f1->GetImageDataSize() << endl;
>     }
>     // delete f1; // this crashes the program.
> }
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Mathieu Malaterre <mathieu.malaterre at kitware.com>
> 27/10/2004 23:06
> 
>  
>         To:     Jean-Michel Rouet/SUR/RESEARCH/PHILIPS at PHILIPS
>         cc:     Dcmlib at creatis.insa-lyon.fr
>         Subject:        Re: [Dcmlib] converting itk,vtk or any other 3D images into dicom.
>         Classification: 
> 
> 
> 
> 
> Salut,
> 
>                  Il y a un test gdcm/TestChangeHeader.cxx qui devrait 
> faire l'affaire.
>                  Pour y aller etapes par etapes, je lirai une image dicom 
> multiframe 
> (y'en a dans gdcmData). Ensuite il faut /sans doute/ changer la taille 
> de l'image (0x0028,0x0011). Puis passer un pointeur vers l'image data. 
> Ensuite y'aura des problemes liee aux bits stored/hish bits et autre, si 
> l'image d'entree est vraiment differente de l'image passer par pointeur.
> 
>                  En clair, ce n'est pas simple, mais gdcm est vraiment 
> tourne'e "d'abord 
> dicom en lecture". Ecriture /from scratch/ c'est encore un peu 
> experimental. gdcm n'a pas de notion de tag necessaire lors de 
> l'ecriture. Donc si l'utilisateur oubli un tag essentiel l'image a de 
> grande chance de ne pas pouvoir etre relue.
> 
>                  En tout cas c'est un tres bon exercice, je vais voir si 
> je peux ajouter 
> un test/exemple dans gdcm.
> 
> HTH
> Mathieu
> 
> jean-michel.rouet at philips.com wrote:
> 
>>Bonjour tout le monde,
>>
>>j'ai regardé un peu sur les archives, mais comme il n'y a pas de 
>>"search" sur la page http://www.creatis.insa-lyon.fr/Public/Gdcm/, je 
>>n'ai rien trouvé!
>>
>>Je cherche a sauver en format dicom des images 3D (lues a partir de .vtk 
> 
> 
>>ou autre).
>>Est-ce que qqun peut m'expliquer un peu comment utiliser gdcm pour faire 
> 
> 
>>ca ?
>>Mais tentatives ont toutes echoué.
>>
>>JM
>>
>>
>>------------------------------------------------------------------------
>>
>>_______________________________________________
>>Dcmlib mailing list
>>Dcmlib at creatis.insa-lyon.fr
>>http://www.creatis.insa-lyon.fr/mailman/listinfo/dcmlib
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> Dcmlib mailing list
> Dcmlib at creatis.insa-lyon.fr
> http://www.creatis.insa-lyon.fr/mailman/listinfo/dcmlib
> 






More information about the Dcmlib mailing list