diff --git a/include/grmBaatzSegmenter.h b/include/grmBaatzSegmenter.h
index 2395f5758edff683c1c24290f4a97c348f888a43..79e1c349624071a1493be31d3ab6149ca3854a39 100644
--- a/include/grmBaatzSegmenter.h
+++ b/include/grmBaatzSegmenter.h
@@ -43,6 +43,7 @@ namespace grm
 		/* Some convenient typedefs */
 		typedef Segmenter<TImage, BaatzNode, BaatzParam> Superclass;
 		typedef TImage ImageType;
+		typedef typename ImageType::PixelType PixelType;
 		typedef BaatzParam ParameterType;
 		typedef typename Superclass::GraphType GraphType;
 		typedef BaatzNode NodeType;
@@ -53,8 +54,8 @@ namespace grm
 
 		float ComputeMergingCost(NodePointerType n1, NodePointerType n2);
 		void UpdateSpecificAttributes(NodePointerType n1, NodePointerType n2);
-		void InitFromImage();
+		void UpdateSpecificAttributes(NodePointerType n, PixelType p);
 	};
 } // end of namespace grm
 #include "grmBaatzSegmenter.txx"
-#endif
\ No newline at end of file
+#endif
diff --git a/include/grmBaatzSegmenter.txx b/include/grmBaatzSegmenter.txx
index b5d61c31eeccc2af6c39b9a6f037c025a2c3865b..bda088777fedf96101224b99da02a25291b3ceb9 100644
--- a/include/grmBaatzSegmenter.txx
+++ b/include/grmBaatzSegmenter.txx
@@ -17,52 +17,28 @@
 =========================================================================*/
 #ifndef GRM_BAATZ_SEGMENTER_TXX
 #define GRM_BAATZ_SEGMENTER_TXX
-#include <otbImageFileReader.h>
-#include <itkImageRegionIterator.h>
 #include "grmBaatzSegmenter.h"
-#include "otbNoDataHelper.h"
 
 namespace grm
 {
 	
-	template<class TImage>
-	void
-	BaatzSegmenter<TImage>::InitFromImage()
-	{
-		typedef itk::ImageRegionIterator<TImage> ImageIterator;
-
-		this->m_ImageWidth = this->m_InputImage->GetLargestPossibleRegion().GetSize()[0];
-		this->m_ImageHeight =this->m_InputImage->GetLargestPossibleRegion().GetSize()[1];
-		this->m_NumberOfComponentsPerPixel = this->m_InputImage->GetNumberOfComponentsPerPixel();
-		
-		std::vector<bool> noDataFlags;
-		std::vector<double> noDataValues;
-		bool noDataPresent = otb::ReadNoDataFlags(this->m_InputImage->GetMetaDataDictionary(),noDataFlags,noDataValues);
-
-		std::size_t idx = 0;
-		ImageIterator it(this->m_InputImage, this->m_InputImage->GetLargestPossibleRegion());
-		for(it.GoToBegin(); !it.IsAtEnd(); ++it)
-		{
-		
-			if (noDataPresent && otb::IsNoData<double>(it.Get(),noDataFlags,noDataValues)) {
-				this->m_Graph.m_Nodes[idx]->m_Expired = true;
-			} else {
-		
-				this->m_Graph.m_Nodes[idx]->m_Means.reserve(this->m_NumberOfComponentsPerPixel);
-				this->m_Graph.m_Nodes[idx]->m_SquareMeans.reserve(this->m_NumberOfComponentsPerPixel);
-				this->m_Graph.m_Nodes[idx]->m_SpectralSum.reserve(this->m_NumberOfComponentsPerPixel);
-				this->m_Graph.m_Nodes[idx]->m_Std.assign(this->m_NumberOfComponentsPerPixel, 0.0f);
-
-				for(std::size_t b = 0; b < this->m_NumberOfComponentsPerPixel; ++b)
-				{
-					this->m_Graph.m_Nodes[idx]->m_Means.push_back(it.Get()[b]);
-					this->m_Graph.m_Nodes[idx]->m_SquareMeans.push_back((it.Get()[b])*(it.Get()[b]));
-					this->m_Graph.m_Nodes[idx]->m_SpectralSum.push_back(it.Get()[b]);
-				}
-			}
-			++idx;
-		}
-	}
+template<class TImage>
+void
+BaatzSegmenter<TImage>::UpdateSpecificAttributes(NodePointerType n, PixelType p)
+{
+
+  n->m_Means.reserve(p.GetSize());
+  n->m_SquareMeans.reserve(p.GetSize());
+  n->m_SpectralSum.reserve(p.GetSize());
+  n->m_Std.assign(p.GetSize(), 0.0f);
+
+  for(std::size_t b = 0; b < p.GetSize(); ++b)
+    {
+    n->m_Means.push_back(p[b]);
+    n->m_SquareMeans.push_back((p[b])*(p[b]));
+    n->m_SpectralSum.push_back(p[b]);
+    }
+}
 
 	template<class TImage>
 	float
@@ -128,4 +104,4 @@ namespace grm
 	}
 } // end of namespace grm
 
-#endif
\ No newline at end of file
+#endif
diff --git a/include/grmFullLambdaScheduleSegmenter.h b/include/grmFullLambdaScheduleSegmenter.h
index 183e2864451eea5c4475facd71aa5ec0d7aa90b7..bfc10b77c30215ded3785dd9d1d4cff3dd43c5ea 100644
--- a/include/grmFullLambdaScheduleSegmenter.h
+++ b/include/grmFullLambdaScheduleSegmenter.h
@@ -35,6 +35,8 @@ namespace grm
 		/* Some convenient typedefs */
 		typedef Segmenter<TImage, FLSNode, FLSParam> Superclass;
 		typedef TImage ImageType;
+        typedef typename ImageType::PixelType PixelType;
+
 		typedef typename Superclass::GraphType GraphType;
 		typedef typename Superclass::NodePointerType NodePointerType;
 		typedef typename Superclass::GraphOperatorType GraphOperatorType;
@@ -42,8 +44,8 @@ namespace grm
 
 		float ComputeMergingCost(NodePointerType n1, NodePointerType n2);
 		void UpdateSpecificAttributes(NodePointerType n1, NodePointerType n2);
-		void InitFromImage();
+		void UpdateSpecificAttributes(NodePointerType n, PixelType p);
 	};
 } // end of namespace grm
 #include "grmFullLambdaScheduleSegmenter.txx"
-#endif
\ No newline at end of file
+#endif
diff --git a/include/grmFullLambdaScheduleSegmenter.txx b/include/grmFullLambdaScheduleSegmenter.txx
index 88f8aae6e517d2e9cbc784ed0e3ba673bd1cc90d..b7faea06f68166ae44c7f67910b1f79088243f50 100644
--- a/include/grmFullLambdaScheduleSegmenter.txx
+++ b/include/grmFullLambdaScheduleSegmenter.txx
@@ -22,29 +22,19 @@
 
 namespace grm
 {
-	template<class TImage>
-	void
-	FullLambdaScheduleSegmenter<TImage>::InitFromImage()
-	{
-		typedef itk::ImageRegionIterator<TImage> ImageIterator;
+template<class TImage>
+void
+FullLambdaScheduleSegmenter<TImage>::UpdateSpecificAttributes(NodePointerType n, PixelType p)
+{
 
-		this->m_ImageWidth = this->m_InputImage->GetLargestPossibleRegion().GetSize()[0];
-		this->m_ImageHeight =this->m_InputImage->GetLargestPossibleRegion().GetSize()[1];
-		this->m_NumberOfComponentsPerPixel = this->m_InputImage->GetNumberOfComponentsPerPixel();
+  n->m_Means.reserve(p.GetSize());
 
-		std::size_t idx = 0;
-		ImageIterator it(this->m_InputImage, this->m_InputImage->GetLargestPossibleRegion());
-		for(it.GoToBegin(); !it.IsAtEnd(); ++it)
-		{
-			this->m_Graph.m_Nodes[idx]->m_Means.reserve(this->m_NumberOfComponentsPerPixel);
+  for(std::size_t b = 0; b < p.GetSize(); ++b)
+    {
+    n->m_Means.push_back(p[b]);
+    }
 
-			for(std::size_t b = 0; b < this->m_NumberOfComponentsPerPixel; ++b)
-			{
-				this->m_Graph.m_Nodes[idx]->m_Means.push_back(it.Get()[b]);
-			}	
-			++idx;
-		}
-	}
+}
 
 	template<class TImage>
 	float
diff --git a/include/grmSegmenter.h b/include/grmSegmenter.h
index 607478dab938e179d253d1eeaabcd86f9b3a6962..1cfba6da4ab21f9e637c4aacdae431df2c7b29ce 100644
--- a/include/grmSegmenter.h
+++ b/include/grmSegmenter.h
@@ -20,6 +20,9 @@
 #include "grmMacroGenerator.h"
 #include "grmGraphOperations.h"
 #include "grmGraphToOtbImage.h"
+#include <otbImageFileReader.h>
+#include <itkImageRegionIterator.h>
+#include "otbNoDataHelper.h"
 
 namespace grm
 {
@@ -32,6 +35,7 @@ namespace grm
 		
 		typedef Segmenter<TImage, TNode, TParam> Self;
 		typedef TImage ImageType;
+        typedef typename ImageType::PixelType PixelType;
 		typedef TNode NodeType;
 		typedef TParam ParamType;
 		typedef Graph<NodeType> GraphType;
@@ -97,14 +101,51 @@ namespace grm
 		 */
 		virtual void UpdateSpecificAttributes(NodePointerType n1, NodePointerType n2) = 0;
 
+		/*
+		 * Given 1 smart adjacent node pointer (boost::shared_ptr), this
+         * method updates the customized attributes of the node according
+         * to the given pixel.
+         *
+		 * @params
+		 * NodePointerType n : Smart pointer to node
+		 * PixelType p: pixel used for attributes computation
+		 *
+		 */
+        virtual void UpdateSpecificAttributes(NodePointerType n, PixelType p) = 0;
+
 		/*
 		 * Given the input image, this method initializes the
 		 * internal and specific attributes of the graph.
 		 *
-		 * @params
-		 * const std::string& inputFileName : input image path
 		 */
-		virtual void InitFromImage() = 0;
+        virtual void InitFromImage()
+        {
+          typedef itk::ImageRegionIterator<ImageType> ImageIterator;
+
+          this->m_ImageWidth = this->m_InputImage->GetLargestPossibleRegion().GetSize()[0];
+          this->m_ImageHeight =this->m_InputImage->GetLargestPossibleRegion().GetSize()[1];
+          this->m_NumberOfComponentsPerPixel = this->m_InputImage->GetNumberOfComponentsPerPixel();
+
+          std::vector<bool> noDataFlags;
+          std::vector<double> noDataValues;
+          bool noDataPresent = otb::ReadNoDataFlags(this->m_InputImage->GetMetaDataDictionary(),noDataFlags,noDataValues);
+
+          std::size_t idx = 0;
+          ImageIterator it(this->m_InputImage, this->m_InputImage->GetLargestPossibleRegion());
+          for(it.GoToBegin(); !it.IsAtEnd(); ++it)
+            {
+
+            if (noDataPresent && otb::IsNoData<double>(it.Get(),noDataFlags,noDataValues))
+              {
+              this->m_Graph.m_Nodes[idx]->m_Expired = true;
+              }
+            else
+              {
+              UpdateSpecificAttributes(this->m_Graph.m_Nodes[idx], it.Get());
+              }
+            ++idx;
+            }
+        }
 
 		/* Return the label image */
 		inline typename LabelImageType::Pointer GetLabeledClusteredOutput()
@@ -170,4 +211,4 @@ namespace grm
 	};
 } // end of namespace grm
 
-#endif
\ No newline at end of file
+#endif
diff --git a/include/grmSpringSegmenter.h b/include/grmSpringSegmenter.h
index 240f4be5b1f53dce59d053f9835ef4c9a603a8a9..5d670d74828a7701a09a251778b21fc5a6b3cce9 100644
--- a/include/grmSpringSegmenter.h
+++ b/include/grmSpringSegmenter.h
@@ -35,6 +35,8 @@ namespace grm
 		/* Some convenient typedefs */
 		typedef Segmenter<TImage, SpringNode, SpringParam> Superclass;
 		typedef TImage ImageType;
+        typedef typename ImageType::PixelType PixelType;
+
 		typedef typename Superclass::GraphType GraphType;
 		typedef typename Superclass::NodePointerType NodePointerType;
 		typedef typename Superclass::GraphOperatorType GraphOperatorType;
@@ -42,7 +44,7 @@ namespace grm
 
 		float ComputeMergingCost(NodePointerType n1, NodePointerType n2);
 		void UpdateSpecificAttributes(NodePointerType n1, NodePointerType n2);
-		void InitFromImage();
+		void UpdateSpecificAttributes(NodePointerType n, PixelType p);
 	};
 } // end of namespace grm
 #include "grmSpringSegmenter.txx"
diff --git a/include/grmSpringSegmenter.txx b/include/grmSpringSegmenter.txx
index b817a2cb2896241ae568d0b778b500642b3ceddd..f78c4e1492427bb7aaaf0eb8b61142c1d09a0c83 100644
--- a/include/grmSpringSegmenter.txx
+++ b/include/grmSpringSegmenter.txx
@@ -26,26 +26,14 @@ namespace grm
 
 	template<class TImage>
 	void
-	SpringSegmenter<TImage>::InitFromImage()
+	SpringSegmenter<TImage>::UpdateSpecificAttributes(NodePointerType n, PixelType p)
 	{
-		typedef itk::ImageRegionIterator<TImage> ImageIterator;
+			n->m_Means.reserve(p.GetSize());
 
-		this->m_ImageWidth = this->m_InputImage->GetLargestPossibleRegion().GetSize()[0];
-		this->m_ImageHeight =this->m_InputImage->GetLargestPossibleRegion().GetSize()[1];
-		this->m_NumberOfComponentsPerPixel = this->m_InputImage->GetNumberOfComponentsPerPixel();
-
-		std::size_t idx = 0;
-		ImageIterator it(this->m_InputImage, this->m_InputImage->GetLargestPossibleRegion());
-		for(it.GoToBegin(); !it.IsAtEnd(); ++it)
-		{
-			this->m_Graph.m_Nodes[idx]->m_Means.reserve(this->m_NumberOfComponentsPerPixel);
-
-			for(std::size_t b = 0; b < this->m_NumberOfComponentsPerPixel; ++b)
+			for(std::size_t b = 0; b < p.GetSize(); ++b)
 			{
-				this->m_Graph.m_Nodes[idx]->m_Means.push_back(it.Get()[b]);
+				n->m_Means.push_back(p[b]);
 			}	
-			++idx;
-		}
 	}
 
 	template<class TImage>