1 /*=========================================================================
2 *
3 * Copyright Insight Software Consortium
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18
19 #include "itkImageFileReader.h"
20 #include "itkImageFileWriter.h"
21 #include "itkSimpleFilterWatcher.h"
22 #include "itkIntensityWindowingImageFilter.h"
23 #include "itkMorphologicalWatershedImageFilter.h"
24 #include "itkLabelOverlayImageFilter.h"
25 #include "itkTestingMacros.h"
26
27
itkMorphologicalWatershedImageFilterTest(int argc,char * argv[])28 int itkMorphologicalWatershedImageFilterTest( int argc, char * argv[] )
29 {
30 if( argc < 6 )
31 {
32 std::cerr << "Missing parameters" << std::endl;
33 std::cerr << "Usage: " << itkNameOfTestExecutableMacro(argv)
34 << " inputImageFile"
35 << " outputImageFile"
36 << " markWatershedLine"
37 << " fullyConnected"
38 << " level"
39 << " [ovelayOutput [alpha]]";
40 std::cerr << std::endl;
41 return EXIT_FAILURE;
42 }
43
44 constexpr unsigned int Dimension = 2;
45
46 using PixelType = unsigned char;
47
48 using ImageType = itk::Image< PixelType, Dimension >;
49
50 using ReaderType = itk::ImageFileReader< ImageType >;
51 ReaderType::Pointer reader = ReaderType::New();
52 reader->SetFileName( argv[1] );
53
54 using FilterType =
55 itk::MorphologicalWatershedImageFilter< ImageType, ImageType >;
56 FilterType::Pointer filter = FilterType::New();
57
58 EXERCISE_BASIC_OBJECT_METHODS( filter, MorphologicalWatershedImageFilter,
59 ImageToImageFilter );
60
61 bool markWatershedLine = std::stoi( argv[3] );
62 TEST_SET_GET_BOOLEAN( filter, MarkWatershedLine, markWatershedLine );
63
64 bool fullyConnected = std::stoi( argv[4] );
65 TEST_SET_GET_BOOLEAN( filter, FullyConnected, fullyConnected );
66
67 auto level = static_cast< FilterType::InputImagePixelType >( std::stod( argv[5] ) );
68 filter->SetLevel( level );
69 TEST_SET_GET_VALUE( level, filter->GetLevel() );
70
71
72 filter->SetInput( reader->GetOutput() );
73
74 itk::SimpleFilterWatcher watcher( filter, "MorphologicalWatershedImageFilter" );
75
76 TRY_EXPECT_NO_EXCEPTION( filter->Update() );
77
78
79 // Rescale the output to have a better display
80 using MaxCalculatorType = itk::MinimumMaximumImageCalculator< ImageType >;
81 MaxCalculatorType::Pointer minMaxCalculator = MaxCalculatorType::New();
82 minMaxCalculator->SetImage( filter->GetOutput() );
83 minMaxCalculator->Compute();
84
85 using RescaleType = itk::IntensityWindowingImageFilter<
86 ImageType, ImageType >;
87 RescaleType::Pointer rescaler = RescaleType::New();
88 rescaler->SetInput( filter->GetOutput() );
89 rescaler->SetWindowMinimum( itk::NumericTraits< PixelType >::ZeroValue() );
90 rescaler->SetWindowMaximum( minMaxCalculator->GetMaximum() );
91 rescaler->SetOutputMaximum( itk::NumericTraits< PixelType >::max() );
92 rescaler->SetOutputMinimum( itk::NumericTraits< PixelType >::ZeroValue() );
93
94 // Write output image
95 using WriterType = itk::ImageFileWriter< ImageType >;
96 WriterType::Pointer writer = WriterType::New();
97 writer->SetInput( rescaler->GetOutput() );
98 writer->SetFileName( argv[2] );
99
100 TRY_EXPECT_NO_EXCEPTION( writer->Update() );
101
102 if( argc > 6 )
103 {
104 using RGBPixelType = itk::RGBPixel< PixelType >;
105 using RGBImageType = itk::Image< RGBPixelType, Dimension >;
106
107 using OverlayType = itk::LabelOverlayImageFilter<
108 ImageType, ImageType, RGBImageType>;
109
110 OverlayType::Pointer overlay = OverlayType::New();
111 overlay->SetInput( reader->GetOutput() );
112 overlay->SetLabelImage( filter->GetOutput() );
113
114 using RGBWriterType = itk::ImageFileWriter< RGBImageType >;
115 RGBWriterType::Pointer rgbwriter = RGBWriterType::New();
116 rgbwriter->SetInput( overlay->GetOutput() );
117 rgbwriter->SetFileName( argv[6] );
118
119 if( argc > 7 )
120 {
121 overlay->SetOpacity( std::stod( argv[7] ) );
122 }
123
124 TRY_EXPECT_NO_EXCEPTION( rgbwriter->Update() );
125 }
126
127 std::cerr << "Test finished" << std::endl;
128 return EXIT_SUCCESS;
129 }
130