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