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

Benoit Regrain benoit.regrain at creatis.insa-lyon.fr
Thu Nov 4 14:26:53 CET 2004


Salut JM,

Lorsque tu auras une version qui marche, tu pourra me l'envoyer stp.
J'essayerai de trouver un peu de temps pour écrire le vtkGdcmWriter à
partir de ce que j'ai déjà et ce que tu auras fait (à moins bien sur que tu
écrive directement cette classe)

Merci d'avance

Benoit


-----------------------------------------------------------------
Benoit Regrain
Ingénieur d'études CNRS (Creatis)
email : regrain at creatis.insa-lyon.fr
phone : (+33) (0) 4.72.43.82.58
fax : (+33) (0) 4.72.43.85.26
INSA - Bâtiment Blaise Pascal
7, avenue Jean Capelle
F - 69621 Villeurbanne Cedex
-----------------------------------------------------------------

----- Original Message ----- 
From: <jean-michel.rouet at philips.com>
To: "Mathieu Malaterre" <mathieu.malaterre at kitware.com>
Cc: <Dcmlib at creatis.insa-lyon.fr>
Sent: Thursday, November 04, 2004 1:45 PM
Subject: Re: [Dcmlib] converting itk,vtk or any other 3D images into dicom.


> 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