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