Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkExtractImageFilter.h"
00019 #include "mitkOverwriteSliceImageFilter.h"
00020 #include "mitkCoreObjectFactory.h"
00021 #include "mitkDataNodeFactory.h"
00022 #include "mitkCompareImageSliceTestHelper.h"
00023
00024 class mitkOverwriteSliceImageFilterTestClass
00025 {
00026
00027 public:
00028
00029 static void Test3D( mitk::OverwriteSliceImageFilter* filter, mitk::Image* image, unsigned int& numberFailed )
00030 {
00031 assert(filter);
00032 assert(image);
00033
00034 filter->SetInput( image );
00035
00036 unsigned int initialNumberFailed = numberFailed;
00037 bool exception = false;
00038
00039 for ( unsigned int sliceDimension = 0; sliceDimension < 6; ++sliceDimension )
00040 {
00041 mitk::ExtractImageFilter::Pointer extractor = mitk::ExtractImageFilter::New();
00042 extractor->SetInput( image );
00043 extractor->SetSliceDimension( sliceDimension );
00044 extractor->SetSliceIndex( 2 );
00045
00046 try
00047 {
00048 extractor->Update();
00049 }
00050 catch(...)
00051 {
00052 if ( sliceDimension < 3 )
00053 {
00054
00055 std::cout << " (WW) Couldn't extract slice number 3 from a 3D image. This could be a problem if the image is not only two slices big." << std::endl;
00056 continue;
00057 }
00058 else
00059 {
00060 continue;
00061 }
00062 }
00063
00064 mitk::Image::Pointer slice = extractor->GetOutput();
00065
00066 filter->SetSliceDimension( sliceDimension );
00067 filter->SetSliceIndex( 1 );
00068 filter->SetSliceImage( slice );
00069
00070 try
00071 {
00072 filter->Update();
00073 }
00074 catch(...)
00075 {
00076 if ( sliceDimension < 3 )
00077 {
00078 ++numberFailed;
00079 std::cerr << " (EE) Couln't overwrite a slice with data from a neigbor in a "
00080 << image->GetDimension()
00081 << "-dimensional image, sliceDimension "
00082 << sliceDimension
00083 << " sliceIndex 1-2." << "(l. " << __LINE__ << ")" << std::endl;
00084 }
00085 else
00086 {
00087
00088 continue;
00089 }
00090 }
00091
00092 mitk::Image::Pointer output = filter->GetOutput();
00093
00094 if (output.IsNull())
00095 {
00096 ++numberFailed;
00097 std::cerr << " (EE) Overwrite filter has output NULL and gave no exception for an "
00098 << image->GetDimension()
00099 << "-dimensional image, sliceDimension "
00100 << sliceDimension
00101 << " sliceIndex 1-2." << "(l. " << __LINE__ << ")" << std::endl;
00102 continue;
00103 }
00104
00105 if (!CompareImageSliceTestHelper::CompareSlice( image, sliceDimension , 1 , slice ))
00106 {
00107 ++numberFailed;
00108 std::cerr << " (EE) Overwriting a slice seemed to work, but the pixels are not correct for an "
00109 << image->GetDimension()
00110 << "-dimensional image, sliceDimension "
00111 << sliceDimension
00112 << " sliceIndex 1-2." << "(l. " << __LINE__ << ")" << std::endl;
00113 }
00114
00115
00116
00117 filter->SetSliceDimension( sliceDimension );
00118 filter->SetSliceIndex( image->GetDimension(sliceDimension) );
00119 filter->SetSliceImage( slice );
00120
00121 exception = false;
00122 try
00123 {
00124 filter->Update();
00125 }
00126 catch(...)
00127 {
00128 exception = true;
00129 }
00130
00131 if (!exception)
00132 {
00133 ++numberFailed;
00134 std::cerr << " (EE) Inserting a slice outside the 3D volume did NOT throw an exception for an "
00135 << image->GetDimension()
00136 << "-dimensional image, sliceDimension "
00137 << sliceDimension
00138 << " sliceIndex 1-2." << "(l. " << __LINE__ << ")" << std::endl;
00139 }
00140
00141
00142 mitk::Image::Pointer originalSlice = slice;
00143
00144
00145 {
00146 unsigned int dim[]={ slice->GetDimension(0) + 2, slice->GetDimension(1) + 2 };
00147 slice = mitk::Image::New();
00148 slice-> Initialize(mitk::PixelType(typeid(signed int)), 2, dim);
00149 unsigned int i;
00150 signed int *p = (signed int*)slice->GetData();
00151 unsigned int size = dim[0]*dim[1];
00152 for(i=0; i<size; ++i, ++p)
00153 *p= (signed int)i;
00154
00155
00156 filter->SetSliceImage( slice );
00157 exception = false;
00158 try
00159 {
00160 filter->Update();
00161 }
00162 catch(...)
00163 {
00164 exception = true;
00165 }
00166
00167 if (!exception)
00168 {
00169 ++numberFailed;
00170 std::cerr << " (EE) Trying to insert a slice of bad dimensions (larger) did NOT throw an exception in an "
00171 << image->GetDimension()
00172 << "-dimensional image, sliceDimension "
00173 << sliceDimension
00174 << " sliceIndex 1-2." << "(l. " << __LINE__ << ")" << std::endl;
00175 }
00176 }
00177
00178
00179 {
00180 slice = originalSlice;
00181 if ( (slice->GetDimension(0) <3) || (slice->GetDimension(1) <3) ) continue;
00182 unsigned int dim[]={ slice->GetDimension(0) - 2, slice->GetDimension(1) - 2 };
00183 slice = mitk::Image::New();
00184 slice-> Initialize(mitk::PixelType(typeid(signed int)), 2, dim);
00185 unsigned int i;
00186 signed int *p = (signed int*)slice->GetData();
00187 unsigned int size = dim[0]*dim[1];
00188 for(i=0; i<size; ++i, ++p)
00189 *p= (signed int)i;
00190
00191
00192 filter->SetSliceImage( slice );
00193 exception = false;
00194 try
00195 {
00196 filter->Update();
00197 }
00198 catch(...)
00199 {
00200 exception = true;
00201 }
00202
00203 if (!exception)
00204 {
00205 ++numberFailed;
00206 std::cerr << " (EE) Trying to insert a slice of bad dimensions (smaller) did NOT throw an exception in an "
00207 << image->GetDimension()
00208 << "-dimensional image, sliceDimension "
00209 << sliceDimension
00210 << " sliceIndex 1-2." << "(l. " << __LINE__ << ")" << std::endl;
00211 }
00212 }
00213
00214 }
00215
00216
00217
00218 if ( numberFailed == initialNumberFailed )
00219 {
00220 std::cout << " (II) Overwriting works nicely (gives result, pixels are good) "
00221 << image->GetDimension()
00222 << "-dimensional image." << "(l. " << __LINE__ << ")" << std::endl;
00223 }
00224 }
00225
00226
00227 static void Test2D( mitk::OverwriteSliceImageFilter* filter, mitk::Image* image, unsigned int& numberFailed )
00228 {
00229 assert(filter);
00230 assert(image);
00231
00232 filter->SetInput( image );
00233 filter->SetSliceImage( image );
00234 bool exception = false;
00235 try
00236 {
00237 filter->Update();
00238 }
00239 catch(...)
00240 {
00241 exception = true;
00242 }
00243
00244 if (!exception)
00245 {
00246 std::cerr << " (EE) Using OverwriteImageFilter for 2D -> 2D did not throw an exception "
00247 << "(l. " << __LINE__ << ")" << std::endl;
00248 }
00249
00250 unsigned int initialNumberFailed = numberFailed;
00251 if ( numberFailed == initialNumberFailed )
00252 {
00253 std::cout << " (II) Overwriting works nicely (gives result, pixels are good) "
00254 << image->GetDimension()
00255 << "-dimensional image." << "(l. " << __LINE__ << ")" << std::endl;
00256 }
00257 }
00258
00259 static void TestOtherD( mitk::OverwriteSliceImageFilter* filter, mitk::Image* image, unsigned int& numberFailed )
00260 {
00261 assert(filter);
00262 assert(image);
00263
00264 filter->SetInput( image );
00265 filter->SetSliceImage( image );
00266 bool exception = false;
00267 try
00268 {
00269 filter->Update();
00270 }
00271 catch(...)
00272 {
00273 exception = true;
00274 }
00275
00276 if (!exception)
00277 {
00278 std::cerr << " (EE) Using OverwriteImageFilter did not throw an exception "
00279 << "(l. " << __LINE__ << ")" << std::endl;
00280 }
00281
00282 unsigned int initialNumberFailed = numberFailed;
00283 if ( numberFailed == initialNumberFailed )
00284 {
00285 std::cout << " (II) Overwriting works nicely (gives result, pixels are good) "
00286 << image->GetDimension()
00287 << "-dimensional image." << "(l. " << __LINE__ << ")" << std::endl;
00288 }
00289 }
00290
00291
00292 };
00293
00295 int mitkOverwriteSliceImageFilterTest(int argc, char* argv[])
00296 {
00297
00298 unsigned int numberFailed(0);
00299
00300
00301 if(argc==0)
00302 {
00303 std::cerr<<"No file specified [FAILED]"<<std::endl;
00304 return EXIT_FAILURE;
00305 }
00306
00307
00308
00309 mitk::Image::Pointer image = NULL;
00310 mitk::DataNodeFactory::Pointer factory = mitk::DataNodeFactory::New();
00311 try
00312 {
00313 std::cout << "Testing with parameter '" << argv[1] << "'" << std::endl;
00314 factory->SetFileName( argv[1] );
00315 factory->Update();
00316
00317 if(factory->GetNumberOfOutputs()<1)
00318 {
00319 std::cerr<<"File could not be loaded [FAILED]"<<std::endl;
00320 return EXIT_FAILURE;
00321 }
00322 mitk::DataNode::Pointer node = factory->GetOutput( 0 );
00323 image = dynamic_cast<mitk::Image*>(node->GetData());
00324 if(image.IsNull())
00325 {
00326 std::cout<<"File not an image - test will not be applied [PASSED]"<<std::endl;
00327 std::cout<<"[TEST DONE]"<<std::endl;
00328 return EXIT_SUCCESS;
00329 }
00330 }
00331 catch ( itk::ExceptionObject & ex )
00332 {
00333 ++numberFailed;
00334 std::cerr << "Exception: " << ex << "[FAILED]" << std::endl;
00335 return EXIT_FAILURE;
00336 }
00337
00338 std::cout << " (II) Could load image." << std::endl;
00339 std::cout << "Testing filter instantiation" << std::endl;
00340
00341
00342 mitk::OverwriteSliceImageFilter::Pointer filter = mitk::OverwriteSliceImageFilter::New();
00343 if (filter.IsNotNull())
00344 {
00345 std::cout << " (II) Instantiation works." << std::endl;
00346 }
00347 else
00348 {
00349 ++numberFailed;
00350 std::cout << "Test failed, and it's the ugliest one!" << std::endl;
00351 return EXIT_FAILURE;
00352 }
00353
00354
00355 if ( image->GetDimension() == 2 )
00356 {
00357 mitkOverwriteSliceImageFilterTestClass::Test2D( filter, image, numberFailed );
00358 }
00359 else if ( image->GetDimension() == 3 )
00360 {
00361 mitkOverwriteSliceImageFilterTestClass::Test3D( filter, image, numberFailed );
00362 }
00363 else
00364 {
00365 mitkOverwriteSliceImageFilterTestClass::TestOtherD( filter, image, numberFailed );
00366 }
00367
00368 std::cout << "Testing filter destruction" << std::endl;
00369
00370
00371 filter = NULL;
00372
00373 std::cout << " (II) Freeing works." << std::endl;
00374
00375 if (numberFailed > 0)
00376 {
00377 std::cerr << numberFailed << " tests failed." << std::endl;
00378 return EXIT_FAILURE;
00379 }
00380 else
00381 {
00382 std::cout << "PASSED all tests." << std::endl;
00383 return EXIT_SUCCESS;
00384 }
00385 }
00386