ITK  5.0.0
Insight Segmentation and Registration Toolkit
itkLabelOverlayFunctor.h
Go to the documentation of this file.
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 #ifndef itkLabelOverlayFunctor_h
19 #define itkLabelOverlayFunctor_h
20 
21 #include "itkLabelToRGBFunctor.h"
22 #include "itkMath.h"
23 
24 namespace itk
25 {
26 namespace Functor
27 {
47 template< typename TInputPixel, typename TLabel, typename TRGBPixel >
49 {
50 public:
52  {
53  // provide some default value for external use (outside
54  // LabelOverlayFunctorImageFilter) Inside LabelOverlayFunctorImageFilter,
55  // the values are always initialized
56  m_Opacity = 1.0;
58  }
59 
60  inline TRGBPixel operator()(const TInputPixel & p1, const TLabel & p2) const
61  {
62  TRGBPixel rgbPixel;
64 
65  if ( p2 == m_BackgroundValue )
66  {
67  // value is background
68  // return a gray pixel with the same intensity than the input pixel
69  auto p = static_cast< typename TRGBPixel::ValueType >( p1 );
70  rgbPixel[0] = p;
71  rgbPixel[1] = p;
72  rgbPixel[2] = p;
73  return rgbPixel;
74  }
75 
76  // taint the input pixel with the colored one returned by
77  // the color functor.
78  TRGBPixel opaque = m_RGBFunctor(p2);
79  // the following has been unrolled due to a bug with apple's
80  // llvm-gcc-4.2 build 5658
81  const double p1_blend= p1 * ( 1.0 - m_Opacity );
82  rgbPixel[0] = static_cast< typename TRGBPixel::ValueType >( opaque[0] * m_Opacity + p1_blend );
83  rgbPixel[1] = static_cast< typename TRGBPixel::ValueType >( opaque[1] * m_Opacity + p1_blend );
84  rgbPixel[2] = static_cast< typename TRGBPixel::ValueType >( opaque[2] * m_Opacity + p1_blend );
85 
86  return rgbPixel;
87  }
88 
89  bool operator!=(const LabelOverlayFunctor & l) const
90  {
91  bool areDifferent = Math::NotExactlyEquals(l.m_Opacity, m_Opacity)
93  || l.m_RGBFunctor != m_RGBFunctor;
94  return areDifferent;
95  }
96 
97  bool operator==(const LabelOverlayFunctor & l) const
98  {
99  return !(*this != l);
100  }
101 
102  ~LabelOverlayFunctor() = default;
103 
104  void SetOpacity(double opacity)
105  {
106  m_Opacity = opacity;
107  }
108 
109  void SetBackgroundValue(TLabel v)
110  {
111  m_BackgroundValue = v;
112  m_RGBFunctor.SetBackgroundValue(v);
113  }
114 
115  void ResetColors()
116  {
117  m_RGBFunctor.ResetColors();
118  }
119 
120  unsigned int GetNumberOfColors() const
121  {
122  return m_RGBFunctor.GetNumberOfColors();
123  }
124 
126  using ComponentType = typename TRGBPixel::ComponentType;
127 
128  void AddColor(unsigned char r, unsigned char g, unsigned char b)
129  {
130  m_RGBFunctor.AddColor(r, g, b);
131  }
132 
133 protected:
134 
135 private:
136  double m_Opacity;
138 
140 };
141 } // end namespace Functor
142 } // end namespace itk
143 
144 #endif
Define numeric traits for std::vector.
bool operator==(const LabelOverlayFunctor &l) const
Functor for applying a colormap to a label image and combine it with a grayscale image.
bool NotExactlyEquals(const TInput1 &x1, const TInput2 &x2)
Definition: itkMath.h:718
Functor for converting labels into RGB triplets.
bool operator!=(const LabelOverlayFunctor &l) const
void AddColor(unsigned char r, unsigned char g, unsigned char b)
TRGBPixel operator()(const TInputPixel &p1, const TLabel &p2) const
Functor::LabelToRGBFunctor< TLabel, TRGBPixel > m_RGBFunctor