20 #ifndef __itkTestMain_h
21 #define __itkTestMain_h
28 #include "itkWin32Header.h"
33 #include "itkNumericTraits.h"
34 #include "itkMultiThreader.h"
36 #include "itkImageFileReader.h"
37 #include "itkImageFileWriter.h"
38 #include "itkImageRegionConstIterator.h"
39 #include "itkSubtractImageFilter.h"
40 #include "itkRescaleIntensityImageFilter.h"
41 #include "itkExtractImageFilter.h"
42 #include "itkTestingComparisonImageFilter.h"
43 #include "itkImageRegion.h"
44 #include "itksys/SystemTools.hxx"
45 #include <itkTextOutput.h>
47 #define ITK_TEST_DIMENSION_MAX 6
52 #define REGISTER_TEST(test) \
53 extern int test(int, char* [] ); \
54 StringToTestFunctionMap[#test] = test
57 const char *baselineImageFilename,
59 double intensityTolerance = 2.0,
60 unsigned int numberOfPixelsTolerance = 0,
61 unsigned int radiusTolerance = 0);
68 std::cout <<
"Available tests:\n";
73 std::cout << i <<
". " << j->first <<
"\n";
79 int main(
int ac,
char* av[] )
81 itk::OutputWindow::SetInstance(itk::TextOutput::New());
83 double intensityTolerance = 2.0;
84 unsigned int numberOfPixelsTolerance = 0;
85 unsigned int radiusTolerance = 0;
87 typedef std::pair< char *, char *> ComparePairType;
88 std::vector< ComparePairType > compareList;
95 std::cout <<
"To run a test, enter the test number: ";
107 std::cerr << testNum <<
" is an invalid test number\n";
110 testToRun = j->first;
114 while( ac > 0 && testToRun.empty() )
116 if (strcmp(av[1],
"--with-threads") == 0)
118 int numThreads = atoi(av[2]);
119 itk::MultiThreader::SetGlobalDefaultNumberOfThreads(numThreads);
123 else if (strcmp(av[1],
"--without-threads") == 0)
125 itk::MultiThreader::SetGlobalDefaultNumberOfThreads(1);
129 else if (ac > 3 && strcmp(av[1],
"--compare") == 0)
131 compareList.push_back( ComparePairType( av[2], av[3] ) );
135 else if (ac > 2 && strcmp(av[1],
"--compareNumberOfPixelsTolerance") == 0)
137 numberOfPixelsTolerance = atoi( av[2] );
141 else if (ac > 2 && strcmp(av[1],
"--compareRadiusTolerance") == 0)
143 radiusTolerance = atoi( av[2] );
147 else if (ac > 2 && strcmp(av[1],
"--compareIntensityTolerance") == 0)
149 intensityTolerance = atof( av[2] );
167 result = (*f)(ac-1, av+1);
170 for(
int i=0; i<static_cast<int>(compareList.size()); i++)
172 char * baselineFilename = compareList[i].first;
173 char * testFilename = compareList[i].second;
175 std::map<std::string,int>::iterator baseline = baselines.begin();
177 int bestBaselineStatus = itk::NumericTraits<int>::max();
178 while (baseline != baselines.end())
181 (baseline->first).c_str(),
184 numberOfPixelsTolerance,
186 if (baseline->second < bestBaselineStatus)
188 bestBaseline = baseline->first;
189 bestBaselineStatus = baseline->second;
191 if (baseline->second == 0)
198 if (bestBaselineStatus)
201 bestBaseline.c_str(),
204 numberOfPixelsTolerance,
209 std::cout <<
"<DartMeasurement name=\"BaselineImageName\" type=\"text/string\">";
210 std::cout << itksys::SystemTools::GetFilenameName(bestBaseline);
211 std::cout <<
"</DartMeasurement>" << std::endl;
213 result += bestBaselineStatus;
216 catch(
const itk::ExceptionObject& e)
218 std::cerr <<
"ITK test driver caught an ITK exception:\n";
222 catch(
const std::exception& e)
224 std::cerr <<
"ITK test driver caught an exception:\n";
225 std::cerr << e.what() <<
"\n";
230 std::cerr <<
"ITK test driver caught an unknown exception!!!\n";
236 std::cerr <<
"Failed: " << testToRun <<
": No test registered with name " << testToRun <<
"\n";
243 const char *baselineImageFilename,
245 double intensityTolerance,
246 unsigned int numberOfPixelsTolerance,
247 unsigned int radiusTolerance )
250 typedef itk::Image<double,ITK_TEST_DIMENSION_MAX>
ImageType;
251 typedef itk::Image<unsigned char,ITK_TEST_DIMENSION_MAX> OutputType;
252 typedef itk::Image<unsigned char,2> DiffOutputType;
253 typedef itk::ImageFileReader<ImageType>
ReaderType;
256 ReaderType::Pointer baselineReader = ReaderType::New();
257 baselineReader->SetFileName(baselineImageFilename);
260 baselineReader->UpdateLargestPossibleRegion();
262 catch (itk::ExceptionObject& e)
264 std::cerr <<
"Exception detected while reading " << baselineImageFilename <<
" : " << e.GetDescription();
269 ReaderType::Pointer testReader = ReaderType::New();
270 testReader->SetFileName(testImageFilename);
273 testReader->UpdateLargestPossibleRegion();
275 catch (itk::ExceptionObject& e)
277 std::cerr <<
"Exception detected while reading " << testImageFilename <<
" : " << e.GetDescription() << std::endl;
283 baselineSize = baselineReader->GetOutput()->GetLargestPossibleRegion().GetSize();
285 testSize = testReader->GetOutput()->GetLargestPossibleRegion().GetSize();
287 if (baselineSize != testSize)
289 std::cerr <<
"The size of the Baseline image and Test image do not match!" << std::endl;
290 std::cerr <<
"Baseline image: " << baselineImageFilename
291 <<
" has size " << baselineSize << std::endl;
292 std::cerr <<
"Test image: " << testImageFilename
293 <<
" has size " << testSize << std::endl;
298 typedef itk::Testing::ComparisonImageFilter<ImageType,ImageType> DiffType;
299 DiffType::Pointer diff = DiffType::New();
300 diff->SetValidInput(baselineReader->GetOutput());
301 diff->SetTestInput(testReader->GetOutput());
302 diff->SetDifferenceThreshold( intensityTolerance );
303 diff->SetToleranceRadius( radiusTolerance );
304 diff->UpdateLargestPossibleRegion();
306 unsigned long status = 0;
307 status = diff->GetNumberOfPixelsWithDifferences();
310 if ( (status > numberOfPixelsTolerance) && reportErrors )
312 typedef itk::RescaleIntensityImageFilter<ImageType,OutputType> RescaleType;
313 typedef itk::ExtractImageFilter<OutputType,DiffOutputType> ExtractType;
314 typedef itk::ImageFileWriter<DiffOutputType>
WriterType;
315 typedef itk::ImageRegion<ITK_TEST_DIMENSION_MAX>
RegionType;
318 RescaleType::Pointer rescale = RescaleType::New();
319 rescale->SetOutputMinimum(itk::NumericTraits<unsigned char>::NonpositiveMin());
320 rescale->SetOutputMaximum(itk::NumericTraits<unsigned char>::max());
321 rescale->SetInput(diff->GetOutput());
322 rescale->UpdateLargestPossibleRegion();
323 size = rescale->GetOutput()->GetLargestPossibleRegion().GetSize();
335 region.SetIndex(index);
337 region.SetSize(size);
339 ExtractType::Pointer extract = ExtractType::New();
340 extract->SetInput(rescale->GetOutput());
341 extract->SetExtractionRegion(region);
343 WriterType::Pointer writer = WriterType::New();
344 writer->SetInput(extract->GetOutput());
346 std::cout <<
"<DartMeasurement name=\"ImageError\" type=\"numeric/double\">";
348 std::cout <<
"</DartMeasurement>" << std::endl;
350 std::ostringstream diffName;
351 diffName << testImageFilename <<
".diff.png";
354 rescale->SetInput(diff->GetOutput());
357 catch(
const std::exception& e)
359 std::cerr <<
"Error during rescale of " << diffName.str() << std::endl;
360 std::cerr << e.what() <<
"\n";
364 std::cerr <<
"Error during rescale of " << diffName.str() << std::endl;
366 writer->SetFileName(diffName.str().c_str());
371 catch(
const std::exception& e)
373 std::cerr <<
"Error during write of " << diffName.str() << std::endl;
374 std::cerr << e.what() <<
"\n";
378 std::cerr <<
"Error during write of " << diffName.str() << std::endl;
381 std::cout <<
"<DartMeasurementFile name=\"DifferenceImage\" type=\"image/png\">";
382 std::cout << diffName.str();
383 std::cout <<
"</DartMeasurementFile>" << std::endl;
385 std::ostringstream baseName;
386 baseName << testImageFilename <<
".base.png";
389 rescale->SetInput(baselineReader->GetOutput());
392 catch(
const std::exception& e)
394 std::cerr <<
"Error during rescale of " << baseName.str() << std::endl;
395 std::cerr << e.what() <<
"\n";
399 std::cerr <<
"Error during rescale of " << baseName.str() << std::endl;
403 writer->SetFileName(baseName.str().c_str());
406 catch(
const std::exception& e)
408 std::cerr <<
"Error during write of " << baseName.str() << std::endl;
409 std::cerr << e.what() <<
"\n";
413 std::cerr <<
"Error during write of " << baseName.str() << std::endl;
416 std::cout <<
"<DartMeasurementFile name=\"BaselineImage\" type=\"image/png\">";
417 std::cout << baseName.str();
418 std::cout <<
"</DartMeasurementFile>" << std::endl;
420 std::ostringstream testName;
421 testName << testImageFilename <<
".test.png";
424 rescale->SetInput(testReader->GetOutput());
427 catch(
const std::exception& e)
429 std::cerr <<
"Error during rescale of " << testName.str() << std::endl;
430 std::cerr << e.what() <<
"\n";
434 std::cerr <<
"Error during rescale of " << testName.str() << std::endl;
438 writer->SetFileName(testName.str().c_str());
441 catch(
const std::exception& e)
443 std::cerr <<
"Error during write of " << testName.str() << std::endl;
444 std::cerr << e.what() <<
"\n";
448 std::cerr <<
"Error during write of " << testName.str() << std::endl;
451 std::cout <<
"<DartMeasurementFile name=\"TestImage\" type=\"image/png\">";
452 std::cout << testName.str();
453 std::cout <<
"</DartMeasurementFile>" << std::endl;
457 return (status > numberOfPixelsTolerance) ? 1 : 0;
470 std::map<std::string,int> baselines;
476 std::string::size_type suffixPos = originalBaseline.rfind(
".");
478 if (suffixPos != std::string::npos)
480 suffix = originalBaseline.substr(suffixPos,originalBaseline.length());
481 originalBaseline.erase(suffixPos,originalBaseline.length());
485 std::ostringstream filename;
486 filename << originalBaseline <<
"." << x << suffix;
487 std::ifstream filestream(filename.str().c_str());
492 baselines[filename.str()] = 0;
499 #include "itkTestingComparisonImageFilter.hxx"
int(* MainFuncPointer)(int, char *[])
Definition: itkTestMain.h:49
ImageType::SizeType SizeType
Definition: niftkMakeLapUSProbeBasicModel.cxx:31
ImageType::IndexType IndexType
Definition: niftkMakeLapUSProbeBasicModel.cxx:32
int main(int ac, char *av[])
Definition: itkTestMain.h:79
GLuint64EXT * result
Definition: glew.h:12084
std::map< std::string, int > RegressionTestBaselines(char *)
Definition: itkTestMain.h:468
itk::ImageFileWriter< IntImageType > WriterType
Definition: niftkDoubleWindowBSI.cxx:56
int RegressionTestImage(const char *testImageFilename, const char *baselineImageFilename, int reportErrors, double intensityTolerance=2.0, unsigned int numberOfPixelsTolerance=0, unsigned int radiusTolerance=0)
Definition: itkTestMain.h:242
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
ImageType::RegionType RegionType
Definition: niftkMakeLapUSProbeBasicModel.cxx:30
#define ITK_TEST_DIMENSION_MAX
Definition: itkTestMain.h:47
GLuint index
Definition: glew.h:1798
GLint GLint GLint GLint GLint x
Definition: glew.h:1236
itk::ImageSeriesReader< ImageType > ReaderType
Definition: niftkBreastDicomSeriesReadImageWrite.cxx:169
itk::Image< PixelType, Dimension > ImageType
Definition: niftkBreastDCEandADC.cxx:91
void PrintAvailableTests()
Definition: itkTestMain.h:66
GLsizeiptr size
Definition: glew.h:1665
GLsizei const GLcharARB ** string
Definition: glew.h:5194
std::map< std::string, MainFuncPointer > StringToTestFunctionMap
Definition: itkTestMain.h:50
void RegisterTests()
Definition: niftkMeshingUnitTests.cxx:23
GLclampf f
Definition: glew.h:3136