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