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 "itkTotalVariationDenoisingImageFilter.h"
00019 #include "itkTotalVariationSingleIterationImageFilter.h"
00020 #include "itkLocalVariationImageFilter.h"
00021 #include "itkImageRegionIterator.h"
00022
00023
00024 typedef itk::Image<float, 3>
00025 ImageType;
00026 typedef itk::ImageRegionIterator<ImageType>
00027 IteratorType;
00028
00029
00030 typedef itk::Vector<float,2>
00031 VectorPixelType;
00032 typedef itk::Image<VectorPixelType, 3>
00033 VectorImageType;
00034 typedef itk::ImageRegionIterator<VectorImageType>
00035 VectorIteratorType;
00036
00040 ImageType::Pointer GenerateTestImage()
00041 {
00042
00043 ImageType::Pointer image = ImageType::New();;
00044
00045
00046 ImageType::SpacingType spacing;
00047 spacing[0] = 1;
00048 spacing[1] = 1;
00049 spacing[2] = 1;
00050 image->SetSpacing(spacing);
00051
00052
00053 ImageType::RegionType largestPossibleRegion;
00054 ImageType::SizeType size = {{3,3,1}};
00055 largestPossibleRegion.SetSize( size );
00056 ImageType::IndexType index = {{0,0,0}};
00057 largestPossibleRegion.SetIndex( index );
00058 image->SetLargestPossibleRegion( largestPossibleRegion );
00059 image->SetBufferedRegion( largestPossibleRegion );
00060
00061
00062 image->Allocate();
00063
00064 int i=0;
00065 IteratorType it(image, largestPossibleRegion);
00066 it.GoToBegin();
00067 while(!it.IsAtEnd())
00068 {
00069 it.Set((float)i++);
00070 ++it;
00071 }
00072
00073 return image;
00074 }
00075
00076 VectorImageType::Pointer GenerateVectorTestImage()
00077 {
00078
00079 VectorImageType::Pointer image = VectorImageType::New();;
00080
00081
00082 VectorImageType::SpacingType spacing;
00083 spacing[0] = 1;
00084 spacing[1] = 1;
00085 spacing[2] = 1;
00086 image->SetSpacing(spacing);
00087
00088
00089 VectorImageType::RegionType largestPossibleRegion;
00090 VectorImageType::SizeType size = {{3,3,1}};
00091 largestPossibleRegion.SetSize( size );
00092 VectorImageType::IndexType index = {{0,0,0}};
00093 largestPossibleRegion.SetIndex( index );
00094 image->SetLargestPossibleRegion( largestPossibleRegion );
00095 image->SetBufferedRegion( largestPossibleRegion );
00096
00097
00098 image->Allocate();
00099
00100 int i=0;
00101 VectorIteratorType it(image, largestPossibleRegion);
00102 it.GoToBegin();
00103 while(!it.IsAtEnd())
00104 {
00105 VectorPixelType vec;
00106 vec[0] = (float)i;
00107 vec[1] = (float)i++;
00108 it.Set(vec);
00109 ++it;
00110 }
00111
00112 return image;
00113 }
00114
00115 void PrintImage(ImageType::Pointer image)
00116 {
00117 IteratorType it(image, image->GetLargestPossibleRegion());
00118 for(it.GoToBegin(); !it.IsAtEnd(); ++it)
00119 {
00120 std::cout << it.Get() << " ";
00121 }
00122 std::cout << std::endl;
00123 }
00124
00125 void PrintVectorImage(VectorImageType::Pointer image)
00126 {
00127 VectorIteratorType it(image, image->GetLargestPossibleRegion());
00128 for(it.GoToBegin(); !it.IsAtEnd(); ++it)
00129 {
00130 std::cout << it.Get() << " ";
00131 }
00132 std::cout << std::endl;
00133 }
00134
00138 int itkTotalVariationDenoisingImageFilterTest(int , char* [])
00139 {
00140
00141 ImageType::Pointer image = GenerateTestImage();
00142 PrintImage(image);
00143
00144 double precision = 0.01;
00145 ImageType::IndexType index = {{1,1,0}};
00146 VectorImageType::IndexType vecIndex = {{1,1,0}};
00147
00148 try
00149 {
00150 typedef itk::LocalVariationImageFilter<ImageType,ImageType>
00151 LocalFilterType;
00152 LocalFilterType::Pointer filter = LocalFilterType::New();
00153 filter->SetInput(image);
00154 filter->SetNumberOfThreads(1);
00155 filter->Update();
00156 ImageType::Pointer outImage = filter->GetOutput();
00157
00158 PrintImage(outImage);
00159 if(fabs(outImage->GetPixel(index) - 4.472) > precision)
00160 {
00161 return EXIT_FAILURE;
00162 }
00163
00164 }
00165 catch (...)
00166 {
00167 return EXIT_FAILURE;
00168 }
00169
00170 try
00171 {
00172 typedef itk::TotalVariationSingleIterationImageFilter<ImageType,ImageType>
00173 SingleFilterType;
00174 SingleFilterType::Pointer sFilter = SingleFilterType::New();
00175 sFilter->SetInput( image );
00176 sFilter->SetOriginalImage(GenerateTestImage());
00177 sFilter->SetLambda(0.5);
00178 sFilter->SetNumberOfThreads(1);
00179 sFilter->Update();
00180 ImageType::Pointer outImageS = sFilter->GetOutput();
00181
00182 PrintImage(outImageS);
00183 if(fabs(outImageS->GetPixel(index) - 4.0) > precision)
00184 {
00185 return EXIT_FAILURE;
00186 }
00187
00188 }
00189 catch (...)
00190 {
00191 return EXIT_FAILURE;
00192 }
00193
00194 try
00195 {
00196 typedef itk::TotalVariationDenoisingImageFilter<ImageType,ImageType>
00197 TVFilterType;
00198 TVFilterType::Pointer tvFilter = TVFilterType::New();
00199 tvFilter->SetInput(image);
00200 tvFilter->SetNumberIterations(30);
00201 tvFilter->SetNumberOfThreads(1);
00202 tvFilter->SetLambda(0.1);
00203 tvFilter->Update();
00204 ImageType::Pointer outImageTV = tvFilter->GetOutput();
00205
00206 PrintImage(outImageTV);
00207 if(fabs(outImageTV->GetPixel(index) - 4.0) > precision)
00208 {
00209 return EXIT_FAILURE;
00210 }
00211
00212 }
00213 catch (...)
00214 {
00215 return EXIT_FAILURE;
00216 }
00217
00218 VectorImageType::Pointer vecImage = GenerateVectorTestImage();
00219 PrintVectorImage(vecImage);
00220
00221 try
00222 {
00223 typedef itk::LocalVariationImageFilter<VectorImageType,ImageType>
00224 LocalVecFilterType;
00225 LocalVecFilterType::Pointer vecFilter = LocalVecFilterType::New();
00226 vecFilter->SetInput(vecImage);
00227 vecFilter->SetNumberOfThreads(1);
00228 vecFilter->Update();
00229 ImageType::Pointer outVecImage = vecFilter->GetOutput();
00230
00231 PrintImage(outVecImage);
00232 if(fabs(outVecImage->GetPixel(index) - 6.324) > precision)
00233 {
00234 return EXIT_FAILURE;
00235 }
00236
00237 }
00238 catch (...)
00239 {
00240 return EXIT_FAILURE;
00241 }
00242
00243 try
00244 {
00245 typedef itk::TotalVariationSingleIterationImageFilter
00246 <VectorImageType,VectorImageType>
00247 SingleVecFilterType;
00248 SingleVecFilterType::Pointer sVecFilter = SingleVecFilterType::New();
00249 sVecFilter->SetInput( vecImage );
00250 sVecFilter->SetOriginalImage(vecImage);
00251 sVecFilter->SetLambda(0.5);
00252 sVecFilter->SetNumberOfThreads(1);
00253 sVecFilter->UpdateLargestPossibleRegion();
00254 VectorImageType::Pointer outVecImageS = sVecFilter->GetOutput();
00255
00256 PrintVectorImage(outVecImageS);
00257 if(fabs(outVecImageS->GetPixel(vecIndex)[1] - 4.0) > precision)
00258 {
00259 return EXIT_FAILURE;
00260 }
00261 }
00262 catch (...)
00263 {
00264 return EXIT_FAILURE;
00265 }
00266
00267 try
00268 {
00269 typedef itk::TotalVariationDenoisingImageFilter
00270 <VectorImageType,VectorImageType> TVVectorFilterType;
00271 TVVectorFilterType::Pointer tvVecFilter = TVVectorFilterType::New();
00272 tvVecFilter->SetInput(vecImage);
00273 tvVecFilter->SetNumberIterations(30);
00274 tvVecFilter->SetNumberOfThreads(1);
00275 tvVecFilter->SetLambda(0.1);
00276 tvVecFilter->Update();
00277 VectorImageType::Pointer outVecImageTV = tvVecFilter->GetOutput();
00278
00279 PrintVectorImage(outVecImageTV);
00280 if(fabs(outVecImageTV->GetPixel(vecIndex)[1] - 4.0) > precision)
00281 {
00282 return EXIT_FAILURE;
00283 }
00284 }
00285 catch (...)
00286 {
00287 return EXIT_FAILURE;
00288 }
00289
00290 return EXIT_SUCCESS;
00291 }
00292