From 48841439120f101a24c7430bd746bff8af8daa77 Mon Sep 17 00:00:00 2001 From: regrain Date: Tue, 30 Nov 2004 15:44:43 +0000 Subject: [PATCH] * Test/ShowDicom.cxx : now can be used with an off-screen rendering to avoid problems (otherwise, the difference test between the visible image and the reference is incorrect. If the reference is greater than the screen resolution, it's produce errors). Can be used for only one image. Can be used with a visible flag. * vtk/vtkGdcmReader.cxx : remove commented codes. * vtk/vtkGdcmReader.h : add the gdcmCommon.h include file to avoid warnings under windows at compilation * vtk/vtkgdcmViewer.cxx : reformat the file. Apply a default window/level for grayscale images * vtk/GdcmToBaseline.cxx : new program to easy create the reference image -- BeNours --- ChangeLog | 13 ++++ vtk/CMakeLists.txt | 13 ++++ vtk/GdcmToBaseline.cxx | 92 ++++++++++++++++++++++++ vtk/vtkGdcmReader.cxx | 12 +--- vtk/vtkGdcmReader.h | 2 + vtk/vtkgdcmViewer.cxx | 158 ++++++++++++++++++++++------------------- 6 files changed, 205 insertions(+), 85 deletions(-) create mode 100644 vtk/GdcmToBaseline.cxx diff --git a/ChangeLog b/ChangeLog index 5b20d42a..95b9e9b8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-11-30 Benoit Regrain + * Test/ShowDicom.cxx : now can be used with an off-screen rendering to + avoid problems (otherwise, the difference test between the visible image + and the reference is incorrect. If the reference is greater than the + screen resolution, it's produce errors). + Can be used for only one image. Can be used with a visible flag. + * vtk/vtkGdcmReader.cxx : remove commented codes. + * vtk/vtkGdcmReader.h : add the gdcmCommon.h include file to avoid warnings + under windows at compilation + * vtk/vtkgdcmViewer.cxx : reformat the file. Apply a default window/level + for grayscale images + * vtk/GdcmToBaseline.cxx : new program to easy create the reference image + 2004-11-30 Benoit Regrain * src/gdcmFile.[h|cxx] : bug fix for ACR-LIBIDO files when writting the file * Test/TestAllReadCompareDicom.cxx, TestReadWriteReadCompare.cxx : add diff --git a/vtk/CMakeLists.txt b/vtk/CMakeLists.txt index a7f2b73d..c3b68cc2 100644 --- a/vtk/CMakeLists.txt +++ b/vtk/CMakeLists.txt @@ -46,6 +46,19 @@ TARGET_LINK_LIBRARIES(vtkgdcmViewer vtkRendering ) +#----------------------------------------------------------------------------- +SET(GdcmToBaseline_SOURCES + GdcmToBaseline.cxx +) +ADD_EXECUTABLE(GdcmToBaseline ${GdcmToBaseline_SOURCES}) +TARGET_LINK_LIBRARIES(GdcmToBaseline + vtkgdcm + vtkIO + vtkImaging + vtkRendering +) + +#----------------------------------------------------------------------------- # Install vtk header INSTALL_FILES(/include FILES vtkGdcmReader.h) diff --git a/vtk/GdcmToBaseline.cxx b/vtk/GdcmToBaseline.cxx new file mode 100644 index 00000000..2f5abb6c --- /dev/null +++ b/vtk/GdcmToBaseline.cxx @@ -0,0 +1,92 @@ +/*========================================================================= + + Program: gdcm + Module: $RCSfile: GdcmToBaseline.cxx,v $ + Language: C++ + Date: $Date: 2004/11/30 15:44:44 $ + Version: $Revision: 1.1 $ + + Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de + l'Image). All rights reserved. See Doc/License.txt or + http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "vtkGdcmReader.h" +#include "vtkImageViewer.h" +#include "vtkImageData.h" +#include "vtkPNGWriter.h" +#include "vtkWindowToImageFilter.h" + + + + +#include "gdcmFile.h" + +#include + +//Generated file: +#include "gdcmDataImages.h" + +int main(int argc, char *argv[]) +{ + if( argc < 3 ) + { + std::cerr << "Usage: " << argv[0] << " image.dcm image.png\n"; + return 0; + } + + std::string filename = argv[1]; + std::cout << "Filename: " << filename << std::endl; + + //Extract name to find the png file matching: + std::string pngfile = argv[2]; + std::cerr << "PNG file: " << pngfile << std::endl; + + // Ok for now still use the original image, + vtkGdcmReader *reader = vtkGdcmReader::New(); + reader->SetFileName( filename.c_str() ); + //reader->SetFileName( "../Testing/Temporary/TestWrite.dcm" ); + reader->Update(); + + vtkImageViewer *viewer = vtkImageViewer::New(); + viewer->SetInput ( reader->GetOutput() ); + + vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange(); + viewer->SetColorWindow (range[1] - range[0]); + viewer->SetColorLevel (0.5 * (range[1] + range[0])); + + int dim[3]; + reader->GetOutput()->GetDimensions( dim ); + viewer->SetSize(dim[0], dim[1]); + viewer->OffScreenRenderingOn(); + + if(dim[2] != 1) + { + //For multifame dicom, take a snapshot of the center slice (+/- 1) + viewer->SetZSlice( dim[2] / 2 ); + } + + viewer->Render(); + + // View to image + vtkWindowToImageFilter *wif = vtkWindowToImageFilter::New(); + wif->SetInput(viewer->GetRenderWindow()); + + // Write to image + vtkPNGWriter *writer=vtkPNGWriter::New(); + writer->SetFileName(argv[2]); + writer->SetInput(wif->GetOutput()); + writer->Write(); + + // Clean up: + reader->Delete(); + viewer->Delete(); + wif->Delete(); + writer->Delete(); + + return 0; +} diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index 4922c856..a7045023 100644 --- a/vtk/vtkGdcmReader.cxx +++ b/vtk/vtkGdcmReader.cxx @@ -58,7 +58,7 @@ #include #include -vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.56 $"); +vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.57 $"); vtkStandardNewMacro(vtkGdcmReader); //----------------------------------------------------------------------------- @@ -278,7 +278,7 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output) unsigned long UpdateProgressCount = 0; // Feeling the allocated memory space with each image/volume: - unsigned char *Dest = (unsigned char *)data->GetPointData()->GetScalars()->GetVoidPointer(0); + unsigned char *Dest = (unsigned char *)data->GetScalarPointer(); for (std::list::iterator filename = InternalFileNameList.begin(); filename != InternalFileNameList.end(); ++filename) @@ -688,14 +688,6 @@ size_t vtkGdcmReader::LoadImageInMemory( // fwrite(Dest,size,1,f2); // fclose(f2); - //GetImageData allocate a (void*)malloc, remove it: - - // CLEANME - // Now, the delete on values keep from GetImageData is useless (made in - // the PixelConvert class) - -// unsigned char * pSource = source; //pointer for later deletion -// delete[] pSource; return size; } diff --git a/vtk/vtkGdcmReader.h b/vtk/vtkGdcmReader.h index d5b86bdb..d3ca650a 100644 --- a/vtk/vtkGdcmReader.h +++ b/vtk/vtkGdcmReader.h @@ -3,6 +3,8 @@ #ifndef __vtkGdcmReader_h #define __vtkGdcmReader_h +#include "gdcmCommon.h" // To avoid warnings concerning the std + #include #include #include diff --git a/vtk/vtkgdcmViewer.cxx b/vtk/vtkgdcmViewer.cxx index 3f64b40b..d70d4944 100644 --- a/vtk/vtkgdcmViewer.cxx +++ b/vtk/vtkgdcmViewer.cxx @@ -33,96 +33,104 @@ // Callback for the interaction class vtkgdcmObserver : public vtkCommand { - public: - virtual char const *GetClassName() const { return "vtkgdcmObserver";} - static vtkgdcmObserver *New() - { return new vtkgdcmObserver; } - vtkgdcmObserver() - { +public: + virtual char const *GetClassName() const + { + return "vtkgdcmObserver"; + } + static vtkgdcmObserver *New() + { + return new vtkgdcmObserver; + } + vtkgdcmObserver() + { this->ImageViewer = NULL; - } - virtual void Execute(vtkObject *, unsigned long event, void* ) - { + } + virtual void Execute(vtkObject *, unsigned long event, void* ) + { if ( this->ImageViewer ) - { - if ( event == vtkCommand::CharEvent ) - { + { + if ( event == vtkCommand::CharEvent ) + { int max = ImageViewer->GetWholeZMax(); int slice = (ImageViewer->GetZSlice() + 1 ) % ++max; ImageViewer->SetZSlice( slice ); ImageViewer->GetRenderer()->ResetCameraClippingRange(); ImageViewer->Render(); - } - } - } - vtkImageViewer2 *ImageViewer; + } + } + } + vtkImageViewer2 *ImageViewer; }; int main(int argc, char *argv[]) { - if( argc < 2 ) - return 0; + if( argc < 2 ) + return 0; - vtkGdcmReader *reader = vtkGdcmReader::New(); - reader->AllowLookupTableOff(); + vtkGdcmReader *reader = vtkGdcmReader::New(); + reader->AllowLookupTableOff(); - if( argc == 2 ) - reader->SetFileName( argv[1] ); - else - for(int i=1; i< argc; i++) - reader->AddFileName( argv[i] ); + if( argc == 2 ) + reader->SetFileName( argv[1] ); + else + for(int i=1; i< argc; i++) + reader->AddFileName( argv[i] ); - reader->DebugOn(); - reader->Update(); - - //print debug info: - reader->GetOutput()->Print( cout ); - - vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); + reader->Update(); - vtkImageViewer2 *viewer = vtkImageViewer2::New(); - - if( reader->GetLookupTable() ) - { - //convert to color: - vtkImageMapToColors *map = vtkImageMapToColors::New (); - map->SetInput (reader->GetOutput()); - map->SetLookupTable (reader->GetLookupTable()); - map->SetOutputFormatToRGB(); - viewer->SetInput ( map->GetOutput() ); - map->Delete(); - } - else - { - viewer->SetInput ( reader->GetOutput() ); - } - viewer->SetupInteractor (iren); - - //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange(); - //viewer->SetColorWindow (range[1] - range[0]); - //viewer->SetColorLevel (0.5 * (range[1] + range[0])); - - // Here is where we setup the observer, - vtkgdcmObserver *obs = vtkgdcmObserver::New(); - obs->ImageViewer = viewer; - iren->AddObserver(vtkCommand::CharEvent,obs); - obs->Delete(); - - iren->Initialize(); - iren->Start(); - - //if you wish you can export dicom to a vtk file - vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New(); - writer->SetInput( reader->GetOutput()); - writer->SetFileName( "foo.vtk" ); - writer->SetFileTypeToBinary(); - writer->Write(); - - reader->Delete(); - iren->Delete(); - viewer->Delete(); - writer->Delete(); + //print debug info: + reader->GetOutput()->Print( cout ); + + vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); + + vtkImageViewer2 *viewer = vtkImageViewer2::New(); + + if( reader->GetLookupTable() ) + { + //convert to color: + vtkImageMapToColors *map = vtkImageMapToColors::New (); + map->SetInput (reader->GetOutput()); + map->SetLookupTable (reader->GetLookupTable()); + map->SetOutputFormatToRGB(); + viewer->SetInput ( map->GetOutput() ); + map->Delete(); + } + else + { + double *range = reader->GetOutput()->GetScalarRange(); + viewer->SetColorLevel (0.5 * (range[1] + range[0])); + viewer->SetColorWindow (range[1] - range[0]); + + viewer->SetInput ( reader->GetOutput() ); + } + viewer->SetupInteractor (iren); - return 0; + //vtkFloatingPointType *range = reader->GetOutput()->GetScalarRange(); + //viewer->SetColorWindow (range[1] - range[0]); + //viewer->SetColorLevel (0.5 * (range[1] + range[0])); + + // Here is where we setup the observer, + vtkgdcmObserver *obs = vtkgdcmObserver::New(); + obs->ImageViewer = viewer; + iren->AddObserver(vtkCommand::CharEvent,obs); + obs->Delete(); + + iren->Initialize(); + iren->Start(); + + //if you wish you can export dicom to a vtk file + vtkStructuredPointsWriter *writer = vtkStructuredPointsWriter::New(); + writer->SetInput( reader->GetOutput()); + writer->SetFileName( "foo.vtk" ); + writer->SetFileTypeToBinary(); + writer->Write(); + + reader->Delete(); + iren->Delete(); + viewer->Delete(); + writer->Delete(); + + return 0; } -- 2.45.1