ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 #ifndef __itkLabelToRGBFunctor_h 00019 #define __itkLabelToRGBFunctor_h 00020 00021 #include <vector> 00022 #include "itkNumericTraits.h" 00023 00024 namespace itk 00025 { 00026 namespace Functor 00027 { 00049 template< class TLabel, class TRGBPixel > 00050 class LabelToRGBFunctor 00051 { 00052 public: 00053 00054 typedef LabelToRGBFunctor Self; 00055 00056 LabelToRGBFunctor() 00057 { 00058 TRGBPixel rgbPixel; 00059 00060 typedef typename TRGBPixel::ValueType ValueType; 00061 00062 // the following colors are from "R", and named: 00063 // "red" "green3" "blue" "cyan" 00064 //"magenta" "darkorange1" "darkgreen" "blueviolet" 00065 //"brown4" "navy" "yellow4" "violetred1" 00066 //"salmon4" "turquoise4" "sienna3" "darkorchid1" 00067 //"springgreen4" "mediumvioletred" "orangered3" "lightseagreen" 00068 //"slateblue" "deeppink1" "aquamarine4" "royalblue1" 00069 //"tomato3" "mediumblue" "violetred4" "darkmagenta" 00070 //"violet" "red4" 00071 // They are a good selection of distinct colours for plotting and 00072 // overlays. 00073 00074 AddColor(255, 0, 0); 00075 AddColor(0, 205, 0); 00076 AddColor(0, 0, 255); 00077 AddColor(0, 255, 255); 00078 AddColor(255, 0, 255); 00079 AddColor(255, 127, 0); 00080 AddColor(0, 100, 0); 00081 AddColor(138, 43, 226); 00082 AddColor(139, 35, 35); 00083 AddColor(0, 0, 128); 00084 AddColor(139, 139, 0); 00085 AddColor(255, 62, 150); 00086 AddColor(139, 76, 57); 00087 AddColor(0, 134, 139); 00088 AddColor(205, 104, 57); 00089 AddColor(191, 62, 255); 00090 AddColor(0, 139, 69); 00091 AddColor(199, 21, 133); 00092 AddColor(205, 55, 0); 00093 AddColor(32, 178, 170); 00094 AddColor(106, 90, 205); 00095 AddColor(255, 20, 147); 00096 AddColor(69, 139, 116); 00097 AddColor(72, 118, 255); 00098 AddColor(205, 79, 57); 00099 AddColor(0, 0, 205); 00100 AddColor(139, 34, 82); 00101 AddColor(139, 0, 139); 00102 AddColor(238, 130, 238); 00103 AddColor(139, 0, 0); 00104 00105 // provide some default value for external use (outside 00106 // LabelToRGBImageFilter) 00107 // Inside LabelToRGBImageFilter, the values are always initialized 00108 NumericTraits<TRGBPixel>::SetLength( m_BackgroundColor, 3); 00109 m_BackgroundColor.Fill(NumericTraits< ValueType >::Zero); 00110 m_BackgroundValue = NumericTraits< TLabel >::Zero; 00111 } 00112 00113 inline TRGBPixel operator()(const TLabel & p) const 00114 { 00115 // value is background 00116 // return a gray pixel with the same intensity than the label pixel 00117 if ( p == m_BackgroundValue ) 00118 { 00119 return m_BackgroundColor; 00120 } 00121 00122 // else, return a colored pixel from the color table 00123 return m_Colors[p % m_Colors.size()]; 00124 } 00125 00126 void AddColor(unsigned char r, unsigned char g, unsigned char b) 00127 { 00128 TRGBPixel rgbPixel; 00129 NumericTraits<TRGBPixel>::SetLength(rgbPixel, 3); 00130 00131 typedef typename TRGBPixel::ValueType ValueType; 00132 00133 ValueType m = NumericTraits<ValueType>::max(); 00134 00135 rgbPixel[0] = static_cast< ValueType >( static_cast< double >( r ) / 255 * m ); 00136 rgbPixel[1] = static_cast< ValueType >( static_cast< double >( g ) / 255 * m ); 00137 rgbPixel[2] = static_cast< ValueType >( static_cast< double >( b ) / 255 * m ); 00138 m_Colors.push_back(rgbPixel); 00139 } 00140 00141 // Empty the color LUT 00142 void ResetColors() 00143 { 00144 m_Colors.clear(); 00145 } 00146 00147 // Get number of colors in the LUT 00148 unsigned int GetNumberOfColors() const 00149 { 00150 return m_Colors.size(); 00151 } 00152 00153 bool operator!=(const Self & l) const 00154 { 00155 const bool areDifferent = m_BackgroundColor != l.m_BackgroundColor 00156 || m_BackgroundValue != l.m_BackgroundValue; 00157 00158 return areDifferent; 00159 } 00160 00161 bool operator==(const Self & other) const 00162 { 00163 return !( *this != other ); 00164 } 00165 00166 void SetBackgroundValue(TLabel v) 00167 { 00168 m_BackgroundValue = v; 00169 } 00170 00171 void SetBackgroundColor(TRGBPixel rgb) 00172 { 00173 m_BackgroundColor = rgb; 00174 } 00175 00176 ~LabelToRGBFunctor() {} 00177 00178 std::vector< TRGBPixel > m_Colors; 00179 00180 TRGBPixel m_BackgroundColor; 00181 00182 TLabel m_BackgroundValue; 00183 }; 00184 } // end namespace functor 00185 } // end namespace itk 00186 00187 #endif 00188