MITK-IGT
IGT Extension of MITK
Loading...
Searching...
No Matches
mitkToFCompositeFilterTest.cpp
Go to the documentation of this file.
1/*============================================================================
2
3The Medical Imaging Interaction Toolkit (MITK)
4
5Copyright (c) German Cancer Research Center (DKFZ)
6All rights reserved.
7
8Use of this source code is governed by a 3-clause BSD license that can be
9found in the LICENSE file.
10
11============================================================================*/
12
13#include <mitkTestingMacros.h>
15
16#include <mitkImage.h>
17#include <mitkImageCast.h>
18#include <itkBilateralImageFilter.h>
20#include <itkThresholdImageFilter.h>
21#include <itkImageRegionIterator.h>
22#include <itkMersenneTwisterRandomVariateGenerator.h>
24#include <itkMedianImageFilter.h>
25#include <mitkImagePixelReadAccessor.h>
26
27
35typedef float ToFScalarType;
36typedef itk::Image<ToFScalarType,2> ItkImageType_2D;
37typedef itk::Image<ToFScalarType,3> ItkImageType_3D;
38typedef itk::ImageRegionIterator<ItkImageType_2D> ItkImageRegionIteratorType2D;
39typedef itk::ImageRegionIterator<ItkImageType_3D> ItkImageRegionIteratorType3D;
40typedef itk::BilateralImageFilter<ItkImageType_2D,ItkImageType_2D> BilateralImageFilterType;
41typedef itk::ThresholdImageFilter<ItkImageType_2D> ThresholdFilterType;
42typedef itk::MedianImageFilter<ItkImageType_2D,ItkImageType_2D> MedianFilterType;
43
44
45/*static bool ApplyTemporalMedianFilter(mitk::Image::Pointer& image, ItkImageType_2D::Pointer& itkImage2D)
46{
47
48 //initialize ITK output image
49 unsigned int dimX = image->GetDimension(0);
50 unsigned int dimY = image->GetDimension(1);
51 unsigned int nbSlices = image->GetDimension(2);
52
53 ItkImageType_2D::SizeType size;
54 size[0] = dimX;
55 size[1] = dimY;
56
57 ItkImageType_2D::RegionType region;
58 region.SetSize(size);
59
60 ItkImageType_2D::SpacingType spacing;
61 spacing[0] = 1.0;
62 spacing[1] = 1.0;
63
64 itkImage2D->SetRegions( region );
65 itkImage2D->SetSpacing ( spacing );
66 itkImage2D->Allocate();
67
68 //initialize median filtering
69 std::vector<ToFScalarType> allDistances;
70 itk::Index<3> curIdx3D;
71 ItkImageType_2D::IndexType curIdx2D;
72
73 //compute median over time for each (x,y)
74 for(unsigned int i = 0; i<dimX; i++)
75 {
76 for(unsigned int j = 0; j < dimY; j++)
77 {
78 allDistances.clear();
79
80 curIdx3D[0] = i; curIdx3D[1] = j;
81 curIdx2D[0] = i; curIdx2D[1] = j;
82 //gather all distances for one pixel
83 mitk::ImagePixelReadAccessor<ToFScalarType,3> imageAcces(image, image->GetVolumeData());
84 for(unsigned int k = 0; k < nbSlices; k++)
85 {
86 curIdx3D[2] = k;
87 allDistances.push_back(imageAcces.GetPixelByIndex(curIdx3D));
88 }
89
90 //sort distances and compute median
91 std::sort(allDistances.begin(),allDistances.end());
92 unsigned int median_idx = nbSlices/2;
93 if(nbSlices%2 == 1) //i.e., there is an odd number of slices
94 {
95 itkImage2D->SetPixel(curIdx2D,allDistances[median_idx]);
96 } else
97 {
98 ToFScalarType upper = allDistances[median_idx];
99 ToFScalarType lower = allDistances[median_idx+1];
100 itkImage2D->SetPixel(curIdx2D,(upper+lower)/2.0);
101 }
102 }
103 }
104 return true;
105
106}*/
107
108bool CreateRandomDistanceImage(unsigned int dimX, unsigned int dimY, ItkImageType_2D::Pointer& itkImage, mitk::Image::Pointer& mitkImage) //TODO warum ITK image?
109{
110
111 //initialize ITK output image
112 ItkImageType_2D::IndexType start;
113 start[0] = 0;
114 start[1] = 0;
115 ItkImageType_2D::SizeType size;
116 size[0] = dimX;
117 size[1] = dimY;
118 ItkImageType_2D::RegionType region;
119 region.SetSize(size);
120 region.SetIndex( start);
121 ItkImageType_2D::SpacingType spacing;
122 spacing[0] = 1.0;
123 spacing[1] = 1.0;
124
125 itkImage->SetRegions( region );
126 itkImage->SetSpacing ( spacing );
127 itkImage->Allocate();
128
129
130 ItkImageRegionIteratorType2D imageIterator(itkImage,itkImage->GetLargestPossibleRegion());
131 imageIterator.GoToBegin();
132 itk::Statistics::MersenneTwisterRandomVariateGenerator::Pointer randomGenerator = itk::Statistics::MersenneTwisterRandomVariateGenerator::New();
133
134
135 while (!imageIterator.IsAtEnd())
136 {
137 ToFScalarType pixelValue = randomGenerator->GetUniformVariate(0.0,1000.0);
138 imageIterator.Set(pixelValue);
139 ++imageIterator;
140 }
141
142 mitk::CastToMitkImage(itkImage,mitkImage);
143
144 return true;
145}
146
147
148bool CreateRandomDistanceImageStack(unsigned int dimX, unsigned int dimY, unsigned int nbSlices, ItkImageType_3D::Pointer& itkImage, mitk::Image::Pointer& mitkImage)
149{
150 //initialize ITK output image
151 ItkImageType_3D::IndexType start;
152 start[0] = 0;
153 start[1] = 0;
154 start[1] = 0;
155 ItkImageType_3D::SizeType size;
156 size[0] = dimX;
157 size[1] = dimY;
158 size[2] = nbSlices;
159 ItkImageType_3D::RegionType region;
160 region.SetSize(size);
161 region.SetIndex( start);
162 ItkImageType_3D::SpacingType spacing;
163 spacing[0] = 1.0;
164 spacing[1] = 1.0;
165 spacing[2] = 1.0;
166
167 itkImage->SetRegions( region );
168 itkImage->SetSpacing ( spacing );
169 itkImage->Allocate();
170
171
172 //assign random pixel values
173 ItkImageRegionIteratorType3D imageIterator(itkImage,itkImage->GetLargestPossibleRegion());
174 imageIterator.GoToBegin();
175 itk::Statistics::MersenneTwisterRandomVariateGenerator::Pointer randomGenerator = itk::Statistics::MersenneTwisterRandomVariateGenerator::New();
176
177
178 while (!imageIterator.IsAtEnd())
179 {
180 ToFScalarType pixelValue = randomGenerator->GetUniformVariate(0.0,1000.0);
181 imageIterator.Set(pixelValue);
182 ++imageIterator;
183 }
184
185 //cast to MITK image
186 mitk::CastToMitkImage(itkImage,mitkImage);
187
188 return true;
189}
190
191
192int mitkToFCompositeFilterTest(int /* argc */, char* /*argv*/[])
193{
194 MITK_TEST_BEGIN("ToFCompositeFilter");
195
196 //initialize composite filter
197 mitk::ToFCompositeFilter::Pointer compositeFilter = mitk::ToFCompositeFilter::New();
198
199 //Initialize threshold filter
200 ThresholdFilterType::Pointer thresholdFilter = ThresholdFilterType::New();
201 int threshold_min = 5;
202 int threshold_max = 100;
203 thresholdFilter->SetOutsideValue(0.0);
204 thresholdFilter->SetLower(threshold_min);
205 thresholdFilter->SetUpper(threshold_max);
206 compositeFilter->SetThresholdFilterParameter(threshold_min, threshold_max);
207
208 //Initialize spatial median filter
209 MedianFilterType::Pointer medianFilter = MedianFilterType::New();
210
211 //Initialize bilateral filter
212 BilateralImageFilterType::Pointer bilateralFilter = BilateralImageFilterType::New();
213 float domainSigma = 4;
214 float rangeSigma = 50;
215 float kernelRadius = 3;
216 bilateralFilter->SetDomainSigma(domainSigma);
217 bilateralFilter->SetRangeSigma(rangeSigma);
218 bilateralFilter->SetRadius(kernelRadius);
219 compositeFilter->SetBilateralFilterParameter(domainSigma,rangeSigma,kernelRadius);
220
221 //Initialize pipeline
222 ItkImageType_2D::Pointer itkInputImage = ItkImageType_2D::New();
223 mitk::Image::Pointer mitkInputImage = mitk::Image::New();
224 CreateRandomDistanceImage(100,100,itkInputImage,mitkInputImage);
225 ItkImageType_2D::Pointer itkOutputImage;
226 compositeFilter->SetInput(mitkInputImage);
227 mitk::Image::Pointer mitkOutputImage = compositeFilter->GetOutput();
228
229
230 //-------------------------------------------------------------------------------------------------------
231
232 //Apply first filter only (threshold)
233
234 //standard variant
235 thresholdFilter->SetInput(itkInputImage);
236 itkOutputImage = thresholdFilter->GetOutput();
237 itkOutputImage->Update();
238
239 //variant with composite filter
240 compositeFilter->SetApplyThresholdFilter(true);
241 compositeFilter->SetApplyMedianFilter(false);
242 compositeFilter->SetApplyTemporalMedianFilter(false);
243 compositeFilter->SetApplyBilateralFilter(false);
244 mitkOutputImage->Update();
245
246 //compare output
247 mitk::Image::Pointer itkOutputImageConverted;
248 mitk::CastToMitkImage(itkOutputImage,itkOutputImageConverted);
249
250 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(*itkOutputImageConverted, *mitkOutputImage, mitk::eps, true),
251 "Test threshold filter in pipeline");
252
253 //-------------------------------------------------------------------------------------------------------
254
255 //Apply first and second filter
256
257 //standard variant
258 medianFilter->SetInput(thresholdFilter->GetOutput());
259 itkOutputImage = medianFilter->GetOutput();
260 itkOutputImage->Update();
261
262 //variant with composite filter
263 compositeFilter->SetApplyMedianFilter(true);
264 mitkOutputImage->Update();
265
266 //compare output
267 mitk::CastToMitkImage(itkOutputImage,itkOutputImageConverted);
268
269 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(*itkOutputImageConverted, *mitkOutputImage, mitk::eps, true),
270 "Test threshold and median filter in pipeline");
271
272
273 //-------------------------------------------------------------------------------------------------------
274
275 //Apply first three filters
276
277 //standard variant
278 bilateralFilter->SetInput(medianFilter->GetOutput());
279 itkOutputImage = bilateralFilter->GetOutput();
280 itkOutputImage->Update();
281
282 //variant with composite filter
283 compositeFilter->SetApplyBilateralFilter(true);
284 mitkOutputImage->Update();
285
286 //compare output
287 mitk::CastToMitkImage(itkOutputImage,itkOutputImageConverted);
288
289 MITK_TEST_CONDITION_REQUIRED( mitk::Equal(*itkOutputImageConverted, *mitkOutputImage, mitk::eps, true),
290 "Test threshold filter, bilateral filter and temporal median filter in pipeline");
291
292
293 //-------------------------------------------------------------------------------------------------------
294 // TODO: Rewrite this. This don't make sense. the itk reference applies a median filter
295 // and threshold filter afterwards. The composite filter does it in the other directtion.
296 // also the input of random image stacks is never set into the composite filter
297
298 //Apply all filters
299
300 //generate image stack
301// ItkImageType_3D::Pointer itkInputImage3D = ItkImageType_3D::New();
302// mitk::Image::Pointer mitkImage3D = mitk::Image::New();
303// CreateRandomDistanceImageStack(100,100,12,itkInputImage3D,mitkImage3D);
304//
305// //standard variant
306// ItkImageType_2D::Pointer medianFilteredImage = ItkImageType_2D::New();
307// ApplyTemporalMedianFilter(mitkImage3D,medianFilteredImage);
308// thresholdFilter->SetInput(medianFilteredImage);
309// itkOutputImage->Update();
310//
311// //variant with composite filter
312// compositeFilter->SetApplyTemporalMedianFilter(true);
313// mitkOutputImage->Update();
314//
315// //compare output
316// mitk::CastToMitkImage(itkOutputImage,itkOutputImageConverted);
317// pipelineSuccess = CompareImages(itkOutputImageConverted,mitkOutputImage);
318// MITK_TEST_CONDITION_REQUIRED(pipelineSuccess,"Test all filters in pipeline");
319
320
321//-------------------------------------------------------------------------------------------------------
322
323 //Check set/get functions
324 mitk::Image::Pointer newImage = mitk::Image::New();
325 mitk::Image::Pointer returnedImage;
326 compositeFilter->SetInput(newImage);
327 returnedImage = compositeFilter->GetInput();
328 MITK_TEST_CONDITION_REQUIRED(newImage == returnedImage,"Get/Set empty image");
329
330 compositeFilter->SetApplyTemporalMedianFilter(false);
331 MITK_TEST_CONDITION_REQUIRED(compositeFilter->GetApplyTemporalMedianFilter()==false,"Get/Set ApplyTemporalMedianFilter");
332
333 compositeFilter->SetApplyMedianFilter(false);
334 MITK_TEST_CONDITION_REQUIRED(compositeFilter->GetApplyMedianFilter()==false,"Get/Set ApplyMedianFilter");
335
336 compositeFilter->SetApplyThresholdFilter(false);
337 MITK_TEST_CONDITION_REQUIRED(compositeFilter->GetApplyThresholdFilter()==false,"Get/Set ApplyThresholdFilter");
338
339 compositeFilter->SetApplyBilateralFilter(false);
340 MITK_TEST_CONDITION_REQUIRED(compositeFilter->GetApplyBilateralFilter()==false,"Get/Set ApplyBilateralFilter");
341
342//-------------------------------------------------------------------------------------------------------
343
344 MITK_TEST_END();
345
346}
itk::Point< ToFScalarType, 2 > ToFPoint2D
itk::BilateralImageFilter< ItkImageType_2D, ItkImageType_2D > BilateralImageFilterType
bool CreateRandomDistanceImage(unsigned int dimX, unsigned int dimY, ItkImageType_2D::Pointer &itkImage, mitk::Image::Pointer &mitkImage)
itk::Image< ToFScalarType, 3 > ItkImageType_3D
bool CreateRandomDistanceImageStack(unsigned int dimX, unsigned int dimY, unsigned int nbSlices, ItkImageType_3D::Pointer &itkImage, mitk::Image::Pointer &mitkImage)
itk::Image< ToFScalarType, 2 > ItkImageType_2D
int mitkToFCompositeFilterTest(int, char *[])
itk::MedianImageFilter< ItkImageType_2D, ItkImageType_2D > MedianFilterType
itk::ImageRegionIterator< ItkImageType_3D > ItkImageRegionIteratorType3D
itk::ThresholdImageFilter< ItkImageType_2D > ThresholdFilterType
itk::ImageRegionIterator< ItkImageType_2D > ItkImageRegionIteratorType2D
mitk::ToFProcessingCommon::ToFPoint2D ToFPoint2D
test for the class "ToFCompositeFilter".
MITKIGTBASE_EXPORT bool Equal(const mitk::NavigationData &leftHandSide, const mitk::NavigationData &rightHandSide, ScalarType eps=mitk::eps, bool verbose=false)
Equal A function comparing two navigation data objects for beeing equal in meta- and imagedata.