]> Creatis software - gdcm.git/blob - Testing/VTKTestRead.cxx
* Test/ : accelerate tests (it's not very significant accelerations).
[gdcm.git] / Testing / VTKTestRead.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: VTKTestRead.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/02/09 15:06:48 $
7   Version:   $Revision: 1.10 $
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 "vtkPNGWriter.h"
29
30 #include <iostream>
31
32 //Generated file:
33 #include "gdcmDataImages.h"
34
35 #ifndef vtkFloatingPointType
36 #define vtkFloatingPointType float
37 #endif
38
39 int VTKReadTest(vtkTesting *t,vtkImageViewer *viewer,
40                 std::string const &filename, 
41                 std::string const &referenceFileName)
42 {
43    int retVal = 0;  //by default this is an error
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    vtkGdcmReader *reader = vtkGdcmReader::New();
54    reader->SetFileName( filename.c_str() );
55    reader->Update();
56
57    double range[2];
58    reader->GetOutput()->GetScalarRange(range);
59    int dim[3];
60    reader->GetOutput()->GetDimensions( dim );
61
62    // Show
63    if(viewer)
64    {
65       viewer->SetInput ( reader->GetOutput() );
66
67       viewer->SetColorWindow (range[1] - range[0]);
68       viewer->SetColorLevel (0.5 * (range[1] + range[0]));
69
70       viewer->SetSize(dim[0], dim[1]);
71       if(dim[2] != 1)
72       {
73          //For multifame dicom, take a snapshot of the center slice (+/- 1)
74          viewer->SetZSlice( dim[2] / 2 );
75       }
76       else
77       {
78          viewer->SetZSlice( 0 );
79       }
80
81       viewer->OffScreenRenderingOff();
82       viewer->Render();
83       viewer->SetInput(NULL);
84    }
85
86    //----------------------------------------------------------------------
87    // Transform the image to be RGB unsigned char, due to the requests in
88    // vtkTesting processing
89    // The pipeline is broken after each process to keep maximum of memory
90    vtkImageData *image=reader->GetOutput();
91    image->Update();
92    image->Register(NULL);
93    reader->Delete();
94
95    // Get the middle slice in the image
96    if(dim[2] != 1)
97    {
98       int *ext=image->GetExtent();
99       vtkImageClip *clip=vtkImageClip::New();
100       clip->SetInput(image);
101       clip->SetOutputWholeExtent(ext[0],ext[1],ext[2],ext[3],
102                                  ext[4]+dim[2] / 2,ext[4]+dim[2] / 2);
103       clip->ClipDataOn();
104       vtkImageTranslateExtent *translat=vtkImageTranslateExtent::New();
105       translat->SetInput(clip->GetOutput());
106       translat->SetTranslation(0,0,-ext[4]-dim[2] / 2);
107
108       image->UnRegister(NULL);
109       image=translat->GetOutput();
110       image->Update();
111       image->Register(NULL);
112       translat->SetOutput(NULL);
113       clip->Delete();
114       translat->Delete();
115    }
116
117    // Set an unsigned char image
118    // Shift/Scale the image 
119    vtkImageShiftScale *iss=vtkImageShiftScale::New();
120    iss->SetInput(image);
121    iss->SetOutputScalarTypeToUnsignedChar();
122    iss->SetShift(-range[0]);
123    iss->SetScale(255.0/(range[1]-range[0]));
124    iss->ClampOverflowOn();
125
126    image->UnRegister(NULL);
127    image=iss->GetOutput();
128    image->Update();
129    image->Register(NULL);
130    iss->Delete();
131
132    // Set 3 components to the image
133    if(image->GetNumberOfScalarComponents()==1)
134    {
135       vtkImageAppendComponents *x3=vtkImageAppendComponents::New();
136       x3->AddInput(image);
137       x3->AddInput(image);
138       x3->AddInput(image);
139
140       image->UnRegister(NULL);
141       image=x3->GetOutput();
142       image->Update();
143       image->Register(NULL);
144       x3->SetOutput(NULL);
145       x3->Delete();
146    }
147    // End of transform
148    //----------------------------------------------------------------------
149
150    // make test
151    ostrstream str;
152    retVal = t->RegressionTest(image,0.0,str);
153    image->UnRegister(NULL);
154
155    if( retVal != vtkTesting::PASSED )
156    {
157       std::cerr << str.str();
158    }
159    str.rdbuf()->freeze(1);
160
161    if( retVal == vtkTesting::PASSED )
162    {
163       std::cerr << "       ... OK" << std::endl;
164       return 0;
165    }
166    else
167    {
168       std::cerr << "       ... Failed" << std::endl;
169       return 1;
170    }
171
172 }
173
174 int VTKTestRead(int argc, char *argv[])
175 {
176    bool show = false;
177    if( argc >= 2 )
178    {
179       if( std::string(argv[1]) == "-V" )
180       {
181          show = true;
182       }
183    }
184
185    int ret = 0;
186    vtkTesting *t = vtkTesting::New();
187    vtkImageViewer *viewer;
188    if( show )
189       viewer = vtkImageViewer::New();
190    else
191       viewer = NULL;
192
193    if( argc < 3+show )
194    {
195       std::cerr << "Usage: " << argv[0] << " [-V] image.dcm ref.png\n";
196       std::cerr << "   -V : to view images to the screen... \n"
197                 << "        this mode can generate errors in the test\n\n";
198    }
199    else
200    {
201       ret = VTKReadTest(t,viewer,argv[1+show],argv[2+show]);
202       t->Delete();
203       if( viewer )
204          viewer->Delete();
205
206       return ret;
207    }
208
209    // Test for all images
210    int i = 0;
211    while( gdcmDataImages[i] != 0 )
212    {
213       std::string filename = GDCM_DATA_ROOT;
214       filename += "/";  //doh!
215       filename += gdcmDataImages[i];
216       std::cerr << "Filename: " << filename << std::endl;
217
218       //Extract name to find the png file matching:
219       std::string pngfile = gdcmDataImages[i++];
220       //pngfile.replace(pngfile.size()-3, 3, "png");
221       //More robust approach:
222       std::string::size_type dot_pos = pngfile.rfind( "." );
223       pngfile = pngfile.substr(0, dot_pos).append( ".png" );
224       pngfile.insert( 0, "Baseline/");
225       //std::cerr << "PNG file: " << pngfile << std::endl;
226
227       ret += VTKReadTest(t,viewer,filename,pngfile);
228    }
229    t->Delete();
230    if( viewer )
231       viewer->Delete();
232
233    return ret;
234 }