00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <mitkImage.h>
00020 #include <mitkImageDataItem.h>
00021 #include <mitkImageCast.h>
00022
00023 #include <itkImage.h>
00024
00025 #include <fstream>
00026 #include <itkSmartPointerForwardReference.txx>
00027 #include <mitkDataNodeFactory.h>
00028 #include <mitkStandardFileLocations.h>
00029
00030 #include <vtkImageData.h>
00031
00032 #include <mitkTestingMacros.h>
00033
00034
00035 int mitkImageTest(int , char* [])
00036 {
00037 MITK_TEST_BEGIN(mitkImageTest);
00038
00039
00040 mitk::Image::Pointer imgMem;
00041 mitk::PixelType pt(typeid(int));
00042 unsigned int dim[]={100,100,20};
00043
00044 std::cout << "Testing creation of Image: ";
00045 imgMem=mitk::Image::New();
00046 if(imgMem.IsNull())
00047 {
00048 std::cout<<"[FAILED]"<<std::endl;
00049 return EXIT_FAILURE;
00050 }
00051 std::cout<<"[PASSED]"<<std::endl;
00052
00053 std::cout << "Testing Initialize(const mitk::PixelType& type, unsigned int dimension, unsigned int *dimensions): ";
00054 imgMem->Initialize(mitk::PixelType(typeid(int)), 3, dim);
00055 std::cout<<"[PASSED]"<<std::endl;
00056
00057 std::cout << "Testing IsInitialized(): ";
00058 if(imgMem->IsInitialized()==false)
00059 {
00060 std::cout<<"[FAILED]"<<std::endl;
00061 return EXIT_FAILURE;
00062 }
00063 std::cout<<"[PASSED]"<<std::endl;
00064
00065 std::cout << "Testing GetData(): ";
00066 int *p = (int*)imgMem->GetData();
00067 if(p==NULL)
00068 {
00069 std::cout<<"[FAILED]"<<std::endl;
00070 return EXIT_FAILURE;
00071 }
00072 std::cout<<"[PASSED]"<<std::endl;
00073
00074 std::cout << "Filling image: ";
00075 unsigned int i;
00076 unsigned int size = dim[0]*dim[1]*dim[2];
00077 for(i=0; i<size; ++i, ++p)
00078 *p= (signed int)i;
00079 std::cout<<"[PASSED]"<<std::endl;
00080
00081 std::cout << "Getting it again and compare with filled values: ";
00082 int *p2 = (int*)imgMem->GetData();
00083 if(p2==NULL)
00084 {
00085 std::cout<<"[FAILED]"<<std::endl;
00086 return EXIT_FAILURE;
00087 }
00088 for(i=0; i<size; ++i, ++p2)
00089 {
00090 if(*p2!= (signed int)i )
00091 {
00092 std::cout<<"[FAILED]"<<std::endl;
00093 return EXIT_FAILURE;
00094 }
00095 }
00096 std::cout<<"[PASSED]"<<std::endl;
00097
00098 std::cout << "Testing IsInitialized(): ";
00099 if(imgMem->IsInitialized()==false)
00100 {
00101 std::cout<<"[FAILED]"<<std::endl;
00102 return EXIT_FAILURE;
00103 }
00104 std::cout<<"[PASSED]"<<std::endl;
00105
00106 std::cout << "Testing GetSliceData() and compare with filled values: ";
00107 p2 = (int*)imgMem->GetSliceData(dim[2]/2)->GetData();
00108 unsigned int xy_size = dim[0]*dim[1];
00109 unsigned int start_mid_slice = (dim[2]/2)*xy_size;
00110 for(i=0; i<xy_size; ++i, ++p2)
00111 {
00112 if(*p2!=(signed int)(i+start_mid_slice))
00113 {
00114 std::cout<<"[FAILED]"<<std::endl;
00115 return EXIT_FAILURE;
00116 }
00117 }
00118 std::cout<<"[PASSED]"<<std::endl;
00119
00120
00121 mitkIpPicDescriptor *pic_slice=mitkIpPicClone(imgMem->GetSliceData(dim[2]/2)->GetPicDescriptor());
00122 imgMem=mitk::Image::New();
00123
00124 std::cout << "Testing reinitializing via Initialize(const mitk::PixelType& type, unsigned int dimension, unsigned int *dimensions): ";
00125 imgMem->Initialize(mitk::PixelType(typeid(int)), 3, dim);
00126 std::cout<<"[PASSED]"<<std::endl;
00127
00128 std::cout << "Testing slice-wise filling via SetPicSlice(): ";
00129 for(i=0;i<dim[2];++i)
00130 {
00131 imgMem->SetPicSlice(pic_slice, i, 0, 0);
00132 }
00133 std::cout<<"[PASSED]"<<std::endl;
00134
00135 std::cout << "Getting it again and compare with filled values: ";
00136 p2 = (int*)imgMem->GetData();
00137 if(p2==NULL)
00138 {
00139 std::cout<<"[FAILED]"<<std::endl;
00140 return EXIT_FAILURE;
00141 }
00142 for(i=0; i<size; ++i, ++p2)
00143 {
00144 if(*p2!= (signed int)((i%xy_size)+start_mid_slice))
00145 {
00146 std::cout<<"[FAILED]"<<std::endl;
00147 return EXIT_FAILURE;
00148 }
00149 }
00150 std::cout<<"[PASSED]"<<std::endl;
00151
00152 std::cout << "Testing IsInitialized(): ";
00153 if(imgMem->IsInitialized()==false)
00154 {
00155 std::cout<<"[FAILED]"<<std::endl;
00156 return EXIT_FAILURE;
00157 }
00158 std::cout<<"[PASSED]"<<std::endl;
00159
00160 std::cout << "Setting a copy of the volume once again: ";
00161 imgMem->SetPicVolume(mitkIpPicClone(imgMem->GetVolumeData(0)->GetPicDescriptor()),0);
00162 std::cout<<"[PASSED]"<<std::endl;
00163
00164 std::cout << "Set a slice with different content via SetPicSlice(): ";
00165 memset(pic_slice->data,0,xy_size*sizeof(int));
00166 imgMem->SetPicSlice(pic_slice, 1);
00167
00168 std::cout << "Getting the volume again and compare the check the changed slice: ";
00169 p2 = (int*)imgMem->GetData();
00170 if(p2==NULL)
00171 {
00172 std::cout<<"[FAILED]"<<std::endl;
00173 return EXIT_FAILURE;
00174 }
00175 p2+=xy_size;
00176 for(i=0; i<xy_size; ++i, ++p2)
00177 {
00178 if(*p2!=0)
00179 {
00180 std::cout<<"[FAILED]"<<std::endl;
00181 return EXIT_FAILURE;
00182 }
00183 }
00184 std::cout<<"[PASSED]"<<std::endl;
00185
00186
00187 std::cout << "Setting volume again: ";
00188 imgMem->SetVolume(imgMem->GetData());
00189 std::cout<<"[PASSED]"<<std::endl;
00190
00191 std::cout << "Set a slice with different content via SetSlice(): ";
00192 memset(pic_slice->data,0,xy_size*sizeof(int));
00193 imgMem->SetSlice(pic_slice->data, 0);
00194
00195 std::cout << "Getting the volume again and compare the check the changed slice: ";
00196 p2 = (int*)imgMem->GetData();
00197 if(p2==NULL)
00198 {
00199 std::cout<<"[FAILED]"<<std::endl;
00200 return EXIT_FAILURE;
00201 }
00202 for(i=0; i<xy_size; ++i, ++p2)
00203 {
00204 if(*p2!=0)
00205 {
00206 std::cout<<"[FAILED]"<<std::endl;
00207 return EXIT_FAILURE;
00208 }
00209 }
00210 std::cout<<"[PASSED]"<<std::endl;
00211
00212
00213
00214
00215
00216
00217
00218 mitkIpPicFree(pic_slice);
00219
00220
00221
00222 mitk::Point3D origin;
00223 mitk::Vector3D right, bottom;
00224 mitk::Vector3D spacing;
00225 mitk::FillVector3D(origin, 17.0, 19.92, 7.83);
00226 mitk::FillVector3D(right, 1.0, 2.0, 3.0);
00227 mitk::FillVector3D(bottom, 0.0, -3.0, 2.0);
00228 mitk::FillVector3D(spacing, 0.78, 0.91, 2.23);
00229
00230 std::cout << "Testing InitializeStandardPlane(rightVector, downVector, spacing): " << std::flush;
00231 mitk::PlaneGeometry::Pointer planegeometry = mitk::PlaneGeometry::New();
00232 planegeometry->InitializeStandardPlane(100, 100, right, bottom, &spacing);
00233 planegeometry->SetOrigin(origin);
00234 std::cout << "done" << std::endl;
00235
00236 std::cout << "Testing Initialize(const mitk::PixelType& type, const mitk::Geometry3D& geometry, unsigned int slices) with PlaneGeometry and GetData(): ";
00237 imgMem->Initialize(mitk::PixelType(typeid(int)), *planegeometry);
00238 p = (int*)imgMem->GetData();
00239 if(p==NULL)
00240 {
00241 std::cout<<"[FAILED]"<<std::endl;
00242 return EXIT_FAILURE;
00243 }
00244 std::cout<<"[PASSED]"<<std::endl;
00245
00246 std::cout << "Testing Initialize(const mitk::PixelType& type, int sDim, const mitk::PlaneGeometry& geometry) and GetData(): ";
00247 imgMem->Initialize(mitk::PixelType(typeid(int)), 40, *planegeometry);
00248 p = (int*)imgMem->GetData();
00249 if(p==NULL)
00250 {
00251 std::cout<<"[FAILED]"<<std::endl;
00252 return EXIT_FAILURE;
00253 }
00254 std::cout<<"[PASSED]"<<std::endl;
00255
00256
00257
00258 std::cout << "Testing correctness of origin via GetGeometry()->GetOrigin(): ";
00259 if( mitk::Equal(imgMem->GetGeometry()->GetOrigin(), origin) == false)
00260 {
00261 std::cout<<"[FAILED]"<<std::endl;
00262 return EXIT_FAILURE;
00263 }
00264 std::cout<<"[PASSED]"<<std::endl;
00265
00266 std::cout << "Testing correctness of origin via GetTimeSlicedGeometry()->GetOrigin(): ";
00267 if( mitk::Equal(imgMem->GetTimeSlicedGeometry()->GetOrigin(), origin) == false)
00268 {
00269 std::cout<<"[FAILED]"<<std::endl;
00270 return EXIT_FAILURE;
00271 }
00272 std::cout<<"[PASSED]"<<std::endl;
00273
00274 mitk::FillVector3D(origin, 37.0, 17.92, 27.83);
00275 std::cout << "Setting origin via SetOrigin(origin): ";
00276 imgMem->SetOrigin(origin);
00277 std::cout<<"[PASSED]"<<std::endl;
00278
00279 std::cout << "Testing correctness of changed origin via GetGeometry()->GetOrigin(): ";
00280 if( mitk::Equal(imgMem->GetGeometry()->GetOrigin(), origin) == false)
00281 {
00282 std::cout<<"[FAILED]"<<std::endl;
00283 return EXIT_FAILURE;
00284 }
00285 std::cout<<"[PASSED]"<<std::endl;
00286
00287 std::cout << "Testing correctness of changed origin via GetTimeSlicedGeometry()->GetOrigin(): ";
00288 if( mitk::Equal(imgMem->GetTimeSlicedGeometry()->GetOrigin(), origin) == false)
00289 {
00290 std::cout<<"[FAILED]"<<std::endl;
00291 return EXIT_FAILURE;
00292 }
00293 std::cout<<"[PASSED]"<<std::endl;
00294
00295 std::cout << "Testing correctness of changed origin via GetSlicedGeometry()->GetGeometry2D(0)->GetOrigin(): ";
00296 if( mitk::Equal(imgMem->GetSlicedGeometry()->GetGeometry2D(0)->GetOrigin(), origin) == false)
00297 {
00298 std::cout<<"[FAILED]"<<std::endl;
00299 return EXIT_FAILURE;
00300 }
00301 std::cout<<"[PASSED]"<<std::endl;
00302
00303
00304
00305 std::cout << "Testing correctness of spacing via GetGeometry()->GetSpacing(): ";
00306 if( mitk::Equal(imgMem->GetGeometry()->GetSpacing(), spacing) == false)
00307 {
00308 std::cout<<"[FAILED]"<<std::endl;
00309 return EXIT_FAILURE;
00310 }
00311 std::cout<<"[PASSED]"<<std::endl;
00312
00313 std::cout << "Testing correctness of spacing via GetTimeSlicedGeometry()->GetSpacing(): ";
00314 if( mitk::Equal(imgMem->GetTimeSlicedGeometry()->GetSpacing(), spacing) == false)
00315 {
00316 std::cout<<"[FAILED]"<<std::endl;
00317 return EXIT_FAILURE;
00318 }
00319 std::cout<<"[PASSED]"<<std::endl;
00320
00321 mitk::FillVector3D(spacing, 7.0, 0.92, 1.83);
00322 std::cout << "Setting spacing via SetSpacing(spacing): ";
00323 imgMem->SetSpacing(spacing);
00324 std::cout<<"[PASSED]"<<std::endl;
00325
00326 std::cout << "Testing correctness of changed spacing via GetGeometry()->GetSpacing(): ";
00327 if( mitk::Equal(imgMem->GetGeometry()->GetSpacing(), spacing) == false)
00328 {
00329 std::cout<<"[FAILED]"<<std::endl;
00330 return EXIT_FAILURE;
00331 }
00332 std::cout<<"[PASSED]"<<std::endl;
00333
00334 std::cout << "Testing correctness of changed spacing via GetTimeSlicedGeometry()->GetSpacing(): ";
00335 if( mitk::Equal(imgMem->GetTimeSlicedGeometry()->GetSpacing(), spacing) == false)
00336 {
00337 std::cout<<"[FAILED]"<<std::endl;
00338 return EXIT_FAILURE;
00339 }
00340 std::cout<<"[PASSED]"<<std::endl;
00341
00342 std::cout << "Testing correctness of changed spacing via GetSlicedGeometry()->GetGeometry2D(0)->GetSpacing(): ";
00343 if( mitk::Equal(imgMem->GetSlicedGeometry()->GetGeometry2D(0)->GetSpacing(), spacing) == false)
00344 {
00345 std::cout<<"[FAILED]"<<std::endl;
00346 return EXIT_FAILURE;
00347 }
00348 std::cout<<"[PASSED]"<<std::endl;
00349
00350
00351 MITK_TEST_OUTPUT(<< "Testing SetImportChannel");
00352 mitk::Image::Pointer vecImg = mitk::Image::New();
00353 vecImg->Initialize(*imgMem->GetPixelType().GetTypeId(), *imgMem->GetGeometry(), 2 , 0 );
00354 vecImg->SetImportChannel(imgMem->GetData(), 0, mitk::Image::CopyMemory );
00355 vecImg->SetImportChannel(imgMem->GetData(), 1, mitk::Image::CopyMemory );
00356 std::cout<<"[PASSED]"<<std::endl;
00357
00358 MITK_TEST_OUTPUT(<< " Testing whether IsValidSlice returns valid after SetImportChannel");
00359 MITK_TEST_CONDITION_REQUIRED( vecImg->IsValidSlice(0,0,1) , "");
00360
00361 MITK_TEST_OUTPUT(<< " Testing whether CopyMemory worked");
00362 MITK_TEST_CONDITION_REQUIRED(imgMem->GetData() != vecImg->GetData(), "");
00363
00364 MITK_TEST_OUTPUT(<< " Testing destruction after SetImportChannel");
00365 vecImg = NULL;
00366 std::cout<<"[PASSED]"<<std::endl;
00367
00368
00369 MITK_TEST_OUTPUT(<< "Testing initialization via vtkImageData");
00370 MITK_TEST_OUTPUT(<< " Setting up vtkImageData");
00371 vtkImageData* vtkimage = vtkImageData::New();
00372 vtkimage->Initialize();
00373 vtkimage->SetDimensions( 2, 3, 4);
00374 double vtkorigin[] = {-350,-358.203, -1363.5};
00375 vtkimage->SetOrigin(vtkorigin);
00376 mitk::Point3D vtkoriginAsMitkPoint;
00377 mitk::vtk2itk(vtkorigin, vtkoriginAsMitkPoint);
00378 double vtkspacing[] = {1.367, 1.367, 2};
00379 vtkimage->SetSpacing(vtkspacing);
00380 vtkimage->SetScalarType( VTK_SHORT );
00381 vtkimage->AllocateScalars();
00382 std::cout<<"[PASSED]"<<std::endl;
00383
00384 MITK_TEST_OUTPUT(<< " Testing mitk::Image::Initialize(vtkImageData*, ...)");
00385 mitk::Image::Pointer mitkByVtkImage = mitk::Image::New();
00386 mitkByVtkImage ->Initialize(vtkimage);
00387 MITK_TEST_CONDITION_REQUIRED(mitkByVtkImage->IsInitialized(), "");
00388
00389 MITK_TEST_OUTPUT(<< " vtkimage->Delete");
00390 vtkimage->Delete();
00391 std::cout<<"[PASSED]"<<std::endl;
00392
00393 MITK_TEST_OUTPUT(<< " Testing whether spacing has been correctly initialized from vtkImageData");
00394 mitk::Vector3D spacing2 = mitkByVtkImage->GetGeometry()->GetSpacing();
00395 mitk::Vector3D vtkspacingAsMitkVector;
00396 mitk::vtk2itk(vtkspacing, vtkspacingAsMitkVector);
00397 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(spacing2,vtkspacingAsMitkVector), "");
00398
00399 MITK_TEST_OUTPUT(<< " Testing whether GetSlicedGeometry(0)->GetOrigin() has been correctly initialized from vtkImageData");
00400 mitk::Point3D origin2 = mitkByVtkImage->GetSlicedGeometry(0)->GetOrigin();
00401 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(origin2,vtkoriginAsMitkPoint), "");
00402
00403 MITK_TEST_OUTPUT(<< " Testing whether GetGeometry()->GetOrigin() has been correctly initialized from vtkImageData");
00404 origin2 = mitkByVtkImage->GetGeometry()->GetOrigin();
00405 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(origin2,vtkoriginAsMitkPoint), "");
00406
00407 MITK_TEST_OUTPUT(<< " Testing whether GetTimeSlicedGeometry()->GetOrigin() has been correctly initialized from vtkImageData");
00408 origin2 = mitkByVtkImage->GetTimeSlicedGeometry()->GetOrigin();
00409 MITK_TEST_CONDITION_REQUIRED(mitk::Equal(origin2,vtkoriginAsMitkPoint), "");
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424 mitk::DataNode::Pointer node;
00425 mitk::DataNodeFactory::Pointer nodeReader = mitk::DataNodeFactory::New();
00426 mitk::StandardFileLocations::Pointer locator = mitk::StandardFileLocations::GetInstance();
00427 MITK_TEST_CONDITION_REQUIRED(locator.IsNotNull(),"Instantiating StandardFileLocations")
00428 try
00429 {
00430 const std::string filename = locator->FindFile("brain.mhd", "Core/Code/Testing/Data");
00431 nodeReader->SetFileName(filename);
00432 nodeReader->Update();
00433 node = nodeReader->GetOutput();
00434 }
00435 catch(...) {
00436 MITK_TEST_FAILED_MSG(<< "Could not read file for testing: " << "brain.mhd");
00437 return NULL;
00438 }
00439
00440 mitk::Image::Pointer image = dynamic_cast<mitk::Image*>(node->GetData());
00441
00442
00443 mitk::Index3D index;
00444 mitk::FillVector3D(index, 55, 39, 50);
00445 MITK_TEST_OUTPUT(<< "Testing mitk::Image::GetPixelValueByIndex");
00446 double val = image->GetPixelValueByIndex(index);
00447 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(val,112.22475433349609), "");
00448
00449
00450 MITK_TEST_OUTPUT(<< "Testing mitk::Image::GetPixelValueByWorldCoordinate");
00451 mitk::Point3D point;
00452 mitk::FillVector3D(point, -5.93752, 18.7199, 6.74218);
00453 val = image->GetPixelValueByWorldCoordinate(point);
00454 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(val,94.456184387207031), "");
00455
00456 MITK_TEST_OUTPUT(<< "Convert to index and access value by mitk::Image::GetPixelValueByIndex again");
00457 mitk::Index3D index2;
00458 image->GetGeometry()->WorldToIndex(point, index2);
00459 float val2 = image->GetPixelValueByIndex(index2);
00460 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(val2,94.456184387207031), "");
00461
00462
00463 MITK_TEST_OUTPUT(<< "Test conversion to itk::Image");
00464 typedef itk::Image<float,3> ItkFloatImage3D;
00465 ItkFloatImage3D::Pointer itkimage;
00466 mitk::CastToItkImage(image, itkimage);
00467 std::cout<<"[PASSED]"<<std::endl;
00468
00469 MITK_TEST_OUTPUT(<< "Testing world->itk-physical->world consistency");
00470 mitk::Point3D itkPhysicalPoint;
00471 image->GetGeometry()->WorldToItkPhysicalPoint(point, itkPhysicalPoint);
00472
00473 mitk::Point3D backTransformedPoint;
00474 image->GetGeometry()->ItkPhysicalPointToWorld(itkPhysicalPoint, backTransformedPoint);
00475 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(point,backTransformedPoint), "");
00476
00477 MITK_TEST_OUTPUT(<< "Compare value of pixel returned by mitk in comparison to itk");
00478 itk::Index<3> idx;
00479 itkimage->TransformPhysicalPointToIndex(itkPhysicalPoint, idx);
00480 float valByItk = itkimage->GetPixel(idx);
00481
00482 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(valByItk,94.456184387207031), "");
00483
00484 MITK_TEST_END();
00485
00486 return EXIT_SUCCESS;
00487 }
00488