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 "mitkImage.h"
00019 #include "mitkPicFileReader.h"
00020 #include "mitkImageWriter.h"
00021 #include "mitkImageAccessByItk.h"
00022
00023 #include <itksys/SystemTools.hxx>
00024
00025 unsigned int numberOfTestImages = 3;
00026
00027
00028 mitk::Image::Pointer CreateTestImage(unsigned int which)
00029 {
00030 mitk::Image::Pointer image = mitk::Image::New();
00031
00032 switch (which)
00033 {
00034 case 0:
00035 {
00036 unsigned int dim[]={10,10,20};
00037
00038 image->Initialize(mitk::PixelType(typeid(int)), 3, dim);
00039 int *p = (int*)image->GetData();
00040 int size = dim[0]*dim[1]*dim[2];
00041 for(int i=0; i<size; ++i, ++p) *p=i - size/2;
00042 }
00043 break;
00044
00045 case 1:
00046 {
00047 unsigned int dim[]={10,10,20};
00048
00049 image->Initialize(mitk::PixelType(typeid(float)), 3, dim);
00050 float *p = (float*)image->GetData();
00051 int size = dim[0]*dim[1]*dim[2];
00052 for(int i=0; i<size; ++i, ++p) *p=(float)i - size/2;
00053 }
00054 break;
00055
00056 case 2:
00057 {
00058 unsigned int dim[]={10,10,20};
00059
00060 image->Initialize(mitk::PixelType(typeid(double)), 3, dim);
00061 double *p = (double*)image->GetData();
00062 int size = dim[0]*dim[1]*dim[2];
00063 for(int i=0; i<size; ++i, ++p) *p=(double)i - size/2;
00064 }
00065 break;
00066
00067
00068 default:
00069 {
00070 unsigned int dim[]={10,10,20};
00071
00072 image->Initialize(mitk::PixelType(typeid(int)), 3, dim);
00073 int *p = (int*)image->GetData();
00074 int size = dim[0]*dim[1]*dim[2];
00075 for(int i=0; i<size; ++i, ++p) *p=i - size/2;
00076 }
00077 }
00078
00079 return image;
00080
00081 }
00082
00083 template < typename TPixel, unsigned int VImageDimension >
00084 void ItkImageProcessing( itk::Image< TPixel, VImageDimension >* itkImage, mitk::Image* mitkImage, bool& identical )
00085 {
00086 typename itk::Image< TPixel, VImageDimension >::Pointer itkImage2;
00087
00088 mitk::CastToItkImage( mitkImage, itkImage2 );
00089
00090 if (!itkImage2 || !itkImage2.GetPointer())
00091 {
00092 identical = false;
00093 return;
00094 }
00095
00096 itk::ImageRegionConstIterator<itk::Image<TPixel, VImageDimension> > iterItkImage1( itkImage, itkImage->GetLargestPossibleRegion() );
00097 itk::ImageRegionConstIterator<itk::Image<TPixel, VImageDimension> > iterItkImage2( itkImage, itkImage2->GetLargestPossibleRegion() );
00098
00099 iterItkImage1.GoToBegin();
00100 iterItkImage2.GoToBegin();
00101
00102 while (!iterItkImage1.IsAtEnd())
00103 {
00104 if (iterItkImage1.Get() != iterItkImage2.Get())
00105 {
00106 std::cout << iterItkImage1.Get() << " != " << iterItkImage2.Get() << std::endl;
00107 identical = false;
00108 return;
00109 }
00110
00111 ++iterItkImage1;
00112 ++iterItkImage2;
00113 }
00114
00115
00116 identical = true;
00117 }
00118
00119 int mitkPicFileIOTest(int, char*[])
00120 {
00121 unsigned int numberFailed(0);
00122
00123 for (unsigned int i = 0; i < numberOfTestImages; ++i)
00124 {
00125 mitk::Image::Pointer originalImage = CreateTestImage(i);
00126 mitk::Image::Pointer secondImage;
00127
00128
00129 try
00130 {
00131 mitk::ImageWriter::Pointer imageWriter = mitk::ImageWriter::New();
00132 imageWriter->SetInput(originalImage);
00133
00134 imageWriter->SetFileName("test_image");
00135 imageWriter->SetExtension(".pic");
00136 imageWriter->Write();
00137 }
00138 catch ( std::exception& e )
00139 {
00140 std::cerr << "Error during attempt to write 'test_image.pic' Exception says:" << std::endl;
00141 std::cerr << e.what() << std::endl;
00142 ++numberFailed;
00143 continue;
00144 }
00145
00146
00147 try
00148 {
00149 mitk::PicFileReader::Pointer imageReader = mitk::PicFileReader::New();
00150
00151 imageReader->SetFileName("test_image.pic");
00152 imageReader->Update();
00153
00154 secondImage = imageReader->GetOutput();
00155 }
00156 catch ( std::exception& e )
00157 {
00158 std::cerr << "Error during attempt to read 'test_image.pic' Exception says:" << std::endl;
00159 std::cerr << e.what() << std::endl;
00160 ++numberFailed;
00161 continue;
00162 }
00163
00164 if (secondImage.IsNull())
00165 {
00166 std::cerr << "Error reading 'test_image.pic'. No image created." << std::endl;
00167 ++numberFailed;
00168 continue;
00169 }
00170
00171 std::remove( "test_image.pic" );
00172
00173
00174
00175 bool identical(false);
00176 AccessFixedDimensionByItk_2( secondImage.GetPointer(), ItkImageProcessing, 3, originalImage.GetPointer(), identical );
00177
00178 if (!identical)
00179 {
00180 std::cerr << "Images differ for testimage " << i << std::endl;
00181 ++numberFailed;
00182 continue;
00183 }
00184 }
00185
00186
00187 if (numberFailed > 0)
00188 {
00189 std::cout << "[FAILED]: " << numberFailed << " of " << numberOfTestImages << " sub-tests failed." << std::endl;
00190 return EXIT_FAILURE;
00191 }
00192 else
00193 {
00194 std::cout << "[PASSED]" << std::endl;
00195 return EXIT_SUCCESS;
00196 }
00197 }
00198