Commit 2f0b73d8 authored by Tomáš Oberhuber's avatar Tomáš Oberhuber
Browse files

Implementing the DICOM reader.

parent afe05ef1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ class tnlDicomHeader
      
      inline tnlDicomSeriesInfo &getSeriesInfo();

      inline bool loadFromFile( const char* fileName );
      inline bool loadFromFile( const tnlString& fileName );

   protected:
      
+2 −2
Original line number Diff line number Diff line
@@ -40,9 +40,9 @@ inline tnlDicomHeader::~tnlDicomHeader()
    delete fileFormat;
}

inline bool tnlDicomHeader::loadFromFile(const char *fileName)
inline bool tnlDicomHeader::loadFromFile( const tnlString& fileName )
{
    OFCondition status = fileFormat->loadFile(fileName);
    OFCondition status = fileFormat->loadFile( fileName.getString() );
    if(status.good())
    {
        isLoaded = true;
+14 −10
Original line number Diff line number Diff line
@@ -26,7 +26,10 @@
#include <core/tnlList.h>
#include <core/tnlString.h>
#include <core/param-types.h>
#include <core/images/tnlImage.h>
#include <core/images/tnlDicomHeader.h>
#include <core/images/tnlRegionOfInterest.h>
#include <mesh/tnlGrid.h>
#include <tnlConfig.h>


@@ -49,7 +52,7 @@ struct WindowCenterWidth

struct ImagesInfo
{
    int width, height, imagesCount, frameUintsCount, bps, colorsCount, mainFrameIndex,
    int imagesCount, frameUintsCount, bps, colorsCount, mainFrameIndex,
        frameSize, maxColorValue, minColorValue;
    WindowCenterWidth window;
};
@@ -59,24 +62,25 @@ struct ImagesInfo
 * DICOM serie (searches the directory of the file). Call isDicomSeriesLoaded()
 * function to check if the load was successful.
 */
class tnlDicomSeries
class tnlDicomSeries : public tnlImage< int >
{
   public:
      
      inline tnlDicomSeries( const char *filePath );
      inline tnlDicomSeries( const tnlString& filePath );
       
      inline virtual ~tnlDicomSeries();

      inline int getImagesCount();
            
      template< typename Vector >
      bool getImage( const int imageIdx,
                     const tnlRegionOfInterest< int > roi,
                     Vector& vector );
       
#ifdef HAVE_DCMTK_H       
      inline const Uint16 *getData();
#endif       
       
      inline int getWidth();
       
      inline int getHeight();
       
      inline int getColorCount();
       
      inline int getBitsPerSampleCount();
@@ -95,11 +99,11 @@ class tnlDicomSeries

   private:
      
      bool loadDicomSeries( const char *filePath );
      bool loadDicomSeries( const tnlString& filePath );
       
      bool retrieveFileList( const char *filePath );
      bool retrieveFileList( const tnlString& filePath );
       
      bool loadImage( char *filePath, int number );
      bool loadImage( const tnlString& filePath, int number );

      tnlList<tnlString *> *fileList;
       
+59 −73
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ int filter(const struct dirent *dire)
    return 1;
}

inline tnlDicomSeries::tnlDicomSeries( const char* filePath)
inline tnlDicomSeries::tnlDicomSeries( const tnlString& filePath)
{
    fileList = new tnlList<tnlString *>();
    dicomImage = 0;
@@ -78,10 +78,10 @@ inline tnlDicomSeries::~tnlDicomSeries()
        delete pixelData;
}

inline bool tnlDicomSeries::retrieveFileList( const char *filePath)
inline bool tnlDicomSeries::retrieveFileList( const tnlString& filePath)
{
    tnlString filePathString(filePath);
    tnlString suffix(filePath, filePathString.getLength() - 3);
    tnlString suffix(filePath.getString(), filePathString.getLength() - 3);
    //char *ima = "ima";
    //char *dcm = "dcm";

@@ -92,8 +92,8 @@ inline bool tnlDicomSeries::retrieveFileList( const char *filePath)
    int fileNamePosition = findLastIndexOf(filePathString,"/");

    //parse file path
    tnlString fileName(filePath, fileNamePosition);
    tnlString directoryPath(filePath, 0, filePathString.getLength() - fileNamePosition);
    tnlString fileName(filePath.getString(), fileNamePosition);
    tnlString directoryPath(filePath.getString(), 0, filePathString.getLength() - fileNamePosition);

    int separatorPosition = findLastIndexOf(fileName, "_");
    if (separatorPosition == -1)
@@ -135,29 +135,25 @@ inline bool tnlDicomSeries::retrieveFileList( const char *filePath)
    return true;
}

inline bool tnlDicomSeries::loadImage(char *filePath, int number)
inline bool tnlDicomSeries::loadImage( const tnlString& filePath, int number)
{
   //load header
   tnlDicomHeader *header = new tnlDicomHeader();
   dicomSeriesHeaders.setSize( fileList->getSize() );
   dicomSeriesHeaders.setElement( number, header );
   if( !header->loadFromFile( filePath ) )
    {
      return false;
    }

   //check series UID
    const tnlString& seriesUID = dicomSeriesHeaders.operator [](0)->getSeriesInfo().getSeriesInstanceUID();
   const tnlString& seriesUID = dicomSeriesHeaders[ 0 ]->getSeriesInfo().getSeriesInstanceUID();
   if( seriesUID != header->getSeriesInfo().getSeriesInstanceUID() )
    {
      return false;
    }

   //load image
   if( dicomImage ) delete dicomImage;
   dicomImage = NULL;

    dicomImage = new DicomImage(filePath);
   dicomImage = new DicomImage( filePath.getString() );

   if(dicomImage->getFrameCount() > 1)
   {
@@ -198,18 +194,18 @@ inline bool tnlDicomSeries::loadImage(char *filePath, int number)

    if(number == 0)
    {
        imagesInfo.height = dicomImage->getHeight();
        this->height = dicomImage->getHeight();
    }
    else if(dicomImage->getHeight() != imagesInfo.height)
    else if(dicomImage->getHeight() != this->height)
    {
        cerr << filePath <<" image has bad height value\n";
    }

    if(number == 0)
    {
        imagesInfo.width = dicomImage->getWidth ();
        this->width = dicomImage->getWidth ();
    }
    else if(dicomImage->getWidth() != imagesInfo.width)
    else if(dicomImage->getWidth() != this->width)
    {
        cerr << filePath <<" image has bad width value\n";
    }
@@ -266,14 +262,14 @@ inline bool tnlDicomSeries::loadImage(char *filePath, int number)
    dicomImage->getOutputData(target,size,16);
    imagesInfo.imagesCount++;

    //delete image object - data are stored separatedly
    //delete image object - data are stored separately
    delete dicomImage;
    dicomImage = NULL;
    return true;
}


inline bool tnlDicomSeries::loadDicomSeries( const char *filePath )
inline bool tnlDicomSeries::loadDicomSeries( const tnlString& filePath )
{
   //load list of files
   if( !retrieveFileList( filePath ) )
@@ -283,9 +279,9 @@ inline bool tnlDicomSeries::loadDicomSeries( const char *filePath )
   int imagesCountToLoad = fileList->getSize();
   for( int i=0; i < imagesCountToLoad; i++ )
   {
         if(!loadImage((fileList->operator [](i))->getString(),i))
      if( !loadImage( ( ( *fileList )[ i ] )->getString(),i ) )
      {
             cerr << (fileList->operator [](i))->getString() << " skipped";
         cerr << ( ( *fileList )[ i ] )->getString() << " skipped";
      }
   }
   return true;
@@ -301,16 +297,6 @@ inline const Uint16 *tnlDicomSeries::getData()
    return pixelData;
}

inline int tnlDicomSeries::getWidth()
{
    return imagesInfo.width;
}

inline int tnlDicomSeries::getHeight()
{
    return imagesInfo.height;
}

inline int tnlDicomSeries::getColorCount()
{
    return imagesInfo.colorsCount;
+4 −0
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ class tnlRegionOfInterest
      
      Index getHeight() const;
      
      template< typename Grid >
         bool setGrid( Grid& grid,
                       bool verbose = false );
      
      bool isIn( const Index row, const Index column ) const;
      
   protected:
Loading