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

jean-michel.rouet at philips.com jean-michel.rouet at philips.com
Thu Nov 4 16:33:31 CET 2004


Tout simplement car je n'ai pas updaté ma version d'ITK, et dans la mienne 
ces classes n'existent pas ;-)

Bon je suis parvenu a ecrire les images correctement.

L'idée est la suivante:


    gdcm::Header *h1 = new gdcm::Header(adicomfile);
 
    ... replace some headers ...

    uint8_t *myData = (uint8_t *) malloc(sliceSize);
    h1->ReplaceOrCreateByNumber(myData, 0, h1->GetGrPixel(), 
h1->GetNumPixel());  // !!! VERY IMPORTANT
    h1->SetImageDataSize( sliceSize );
 
    gdcm::File  *f1 = new gdcm::File(h1);
    f1->SetImageData( myData, sliceSize); // !!! IMPORTANT TOO
 
    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

 
        // copy the content !!!
        memcpy(myData,imageData+z*sizex*sizey,sliceSize);

        // And write
        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;
    }

Ca ca fonctionne.

Ce que je suis en train de regarder maintenant, c'est comment le faire 
sans lire d'image dicom pour remplir les champs par defaut...
Il faudrait peut etre alors revoir le constructeur de gdcm::Header car si 
on ne lui passe pas d'argument, il n'initialise pas les champs 
correctement.
Pour l'instant je m'en tire en lui passant un nom de fichier qui n'existe 
pas, mais ce n'est pas tres propre...
Il me reste aussi a mettre des champs de SeriesUID et autre correctement 
pour que l'image soit reconnue comme une sequence de dicom, et sur ce 
point je n'ai pas trop de connaissances a priori.

Des que ca fonctionne correctement, je poste le code au cas ou des gens 
sont interessés.

JM

 



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











More information about the Dcmlib mailing list