]> Creatis software - gdcm.git/blob - Testing/VTKTestRead.cxx
COMP: Dont know what bool is used for
[gdcm.git] / Testing / VTKTestRead.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: VTKTestRead.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/01/22 22:51:40 $
7   Version:   $Revision: 1.6 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 #include "gdcmFileHelper.h"
19 #include "vtkGdcmReader.h"
20 #include "vtkImageViewer.h"
21 #include "vtkImageData.h"
22 #include "vtkRegressionTestImage.h"
23 #include "vtkImageClip.h"
24 #include "vtkImageTranslateExtent.h"
25 #include "vtkImageAppendComponents.h"
26 #include "vtkImageShiftScale.h"
27
28 #include <iostream>
29
30 //Generated file:
31 #include "gdcmDataImages.h"
32
33 #ifndef vtkFloatingPointType
34 #define vtkFloatingPointType float
35 #endif
36
37 int VTKReadTest(vtkTesting *t,vtkImageViewer *viewer,
38                 std::string const & filename, 
39                 std::string const & referenceFileName,
40                 bool show )
41 {
42    int retVal = 0;  //by default this is an error
43    (void)show;
44
45    t->CleanArguments();
46    t->AddArgument("-D");
47    t->AddArgument( GDCM_DATA_ROOT );
48    t->AddArgument("-V");
49    t->AddArgument( referenceFileName.c_str() );
50    t->AddArgument("-T");
51    t->AddArgument( "." );
52    
53    // Instead of directly reading the dicom let's write it down to another file
54    // do a scope to be sure everything gets cleanup
55    {
56       gdcm::FileHelper file( filename );
57       file.GetImageData();
58       file.SetWriteModeToRaw();
59       file.WriteDcmExplVR( "TestWrite.dcm" );
60    }
61  
62    // Ok for now still use the original image, 
63    vtkGdcmReader *reader = vtkGdcmReader::New();
64    //reader->SetFileName( filename.c_str() );
65    reader->SetFileName( "TestWrite.dcm" );
66    reader->Update();
67
68    double *range=reader->GetOutput()->GetScalarRange();
69    int dim[3];
70    reader->GetOutput()->GetDimensions( dim );
71
72    // Show
73    if(viewer)
74    {
75       viewer->SetInput ( reader->GetOutput() );
76
77       viewer->SetColorWindow (range[1] - range[0]);
78       viewer->SetColorLevel (0.5 * (range[1] + range[0]));
79
80       viewer->SetSize(dim[0], dim[1]);
81       if(dim[2] != 1)
82       {
83          //For multifame dicom, take a snapshot of the center slice (+/- 1)
84          viewer->SetZSlice( dim[2] / 2 );
85       }
86       else
87       {
88          viewer->SetZSlice( 0 );
89       }
90
91       viewer->OffScreenRenderingOff();
92       viewer->Render();
93       viewer->SetInput(NULL);
94    }
95
96    //----------------------------------------------------------------------
97    // Transform the image to be RGB unsigned char, due to the requests in
98    // vtkTesting processing
99    // The pipeline is broken after each process to keep maximum of memory
100    vtkImageData *image=reader->GetOutput();
101    image->Update();
102    image->Register(NULL);
103    reader->Delete();
104
105    // Get the middle slice in the image
106    if(dim[2] != 1)
107    {
108       int *ext=image->GetExtent();
109       vtkImageClip *clip=vtkImageClip::New();
110       clip->SetInput(image);
111       clip->SetOutputWholeExtent(ext[0],ext[1],ext[2],ext[3],
112                                  ext[4]+dim[2] / 2,ext[4]+dim[2] / 2);
113       clip->ClipDataOn();
114       vtkImageTranslateExtent *translat=vtkImageTranslateExtent::New();
115       translat->SetInput(clip->GetOutput());
116       translat->SetTranslation(0,0,-ext[4]-dim[2] / 2);
117
118       image->UnRegister(NULL);
119       image=translat->GetOutput();
120       image->Update();
121       image->Register(NULL);
122       translat->SetOutput(NULL);
123       clip->Delete();
124       translat->Delete();
125    }
126
127    // Set an unsigned char image
128    // Shift/Scale the image 
129    image->Update();
130    vtkImageShiftScale *iss=vtkImageShiftScale::New();
131    iss->SetInput(image);
132    iss->SetOutputScalarTypeToUnsignedChar();
133    iss->SetShift(-range[0]);
134    iss->SetScale(255.0/(range[1]-range[0]));
135    iss->ClampOverflowOn();
136
137    image->UnRegister(NULL);
138    image=iss->GetOutput();
139    image->Update();
140    image->Register(NULL);
141    iss->Delete();
142
143    // Set 3 components to the image
144    if(image->GetNumberOfScalarComponents()==1)
145    {
146       vtkImageAppendComponents *x3=vtkImageAppendComponents::New();
147       x3->AddInput(image);
148       x3->AddInput(image);
149       x3->AddInput(image);
150
151       image->UnRegister(NULL);
152       image=x3->GetOutput();
153       image->Update();
154       image->Register(NULL);
155       x3->SetOutput(NULL);
156       x3->Delete();
157    }
158    // End of transform
159    //----------------------------------------------------------------------
160
161    // make test
162    ostrstream str;
163    retVal = t->RegressionTest(image,0.0,str);
164    image->UnRegister(NULL);
165
166    if( retVal != vtkTesting::PASSED )
167    {
168       std::cerr << str.str();
169    }
170    str.rdbuf()->freeze(1);
171
172    if( retVal == vtkTesting::PASSED )
173    {
174       std::cerr << "       ... OK" << std::endl;
175       return 0;
176    }
177    else
178    {
179       std::cerr << "       ... Failed" << std::endl;
180       return 1;
181    }
182
183 }
184
185 int VTKTestRead(int argc, char *argv[])
186 {
187    bool show = false;
188    if( argc >= 2 )
189    {
190       if( std::string(argv[1]) == "-V" )
191       {
192          show = true;
193       }
194    }
195
196    int ret = 0;
197    vtkTesting* t = vtkTesting::New();
198    vtkImageViewer *viewer;
199    if( show )
200       viewer = vtkImageViewer::New();
201    else
202       viewer = NULL;
203
204    if( argc < 3+show )
205    {
206       std::cerr << "Usage: " << argv[0] << " [-V] image.dcm ref.png\n";
207       std::cerr << "   -V : to view images to the screen... \n"
208                 << "        this mode can generate errors in the test\n\n";
209    }
210    else
211    {
212       ret = VTKReadTest(t,viewer,argv[1+show],argv[2+show],show);
213       t->Delete();
214       if( viewer )
215          viewer->Delete();
216
217       return ret;
218    }
219
220    // Test for all images
221    int i = 0;
222    while( gdcmDataImages[i] != 0 )
223    {
224       std::string filename = GDCM_DATA_ROOT;
225       filename += "/";  //doh!
226       filename += gdcmDataImages[i];
227       std::cerr << "Filename: " << filename << std::endl;
228
229       //Extract name to find the png file matching:
230       std::string pngfile = gdcmDataImages[i++];
231       //pngfile.replace(pngfile.size()-3, 3, "png");
232       //More robust approach:
233       std::string::size_type dot_pos = pngfile.rfind( "." );
234       pngfile = pngfile.substr(0, dot_pos).append( ".png" );
235       pngfile.insert( 0, "Baseline/");
236       //std::cerr << "PNG file: " << pngfile << std::endl;
237
238       ret += VTKReadTest(t,viewer,filename,pngfile,show);
239    }
240    t->Delete();
241    if( viewer )
242       viewer->Delete();
243
244    return ret;
245 }