]> Creatis software - creaRigidRegistration.git/blobdiff - lib/Substraction.cxx
#2810 crea RigidRegistration Bug New Normal - update Transform3D3PointsBox
[creaRigidRegistration.git] / lib / Substraction.cxx
index ee25e7039499e38a54ce08ff897c2532b04e3d9c..b6f50690dc612ca1ad2482e2c39673e0cfe174a7 100644 (file)
@@ -1,3 +1,29 @@
+/*
+# ---------------------------------------------------------------------
+#
+# Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
+#                        pour la Santé)
+# Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
+# Previous Authors : Laurent Guigues, Jean-Pierre Roux
+# CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
+#
+#  This software is governed by the CeCILL-B license under French law and 
+#  abiding by the rules of distribution of free software. You can  use, 
+#  modify and/ or redistribute the software under the terms of the CeCILL-B 
+#  license as circulated by CEA, CNRS and INRIA at the following URL 
+#  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
+#  or in the file LICENSE.txt.
+#
+#  As a counterpart to the access to the source code and  rights to copy,
+#  modify and redistribute granted by the license, users are provided only
+#  with a limited warranty  and the software's author,  the holder of the
+#  economic rights,  and the successive licensors  have only  limited
+#  liability. 
+#
+#  The fact that you are presently reading this means that you have had
+#  knowledge of the CeCILL-B license and that you accept its terms.
+# ------------------------------------------------------------------------      */                                                                    
+
 #include "Substraction.h"
 
 Substraction::Substraction(vtkImageData* imageData1,vtkImageData* imageData2, int uZLevel,int lZLevel, std::vector<double> uColor, std::vector<double> lColor, std::vector<double> mColor)
@@ -6,7 +32,7 @@ Substraction::Substraction(vtkImageData* imageData1,vtkImageData* imageData2, in
        sizeImage=0;
        uZeroLevel=uZLevel;
        lZeroLevel=lZLevel;
-       if(uColor.size() != NULL)
+       if(uColor.size() != 0)
        {
                upperColor[0] = uColor[0];
                upperColor[1] = uColor[1];
@@ -18,7 +44,7 @@ Substraction::Substraction(vtkImageData* imageData1,vtkImageData* imageData2, in
                upperColor[1] = 255;
                upperColor[2] = 255;
        }       
-       if(mColor.size() != NULL)
+       if(mColor.size() != 0)
        {
                mediumColor[0] = mColor[0];
                mediumColor[1] = mColor[1];
@@ -30,7 +56,7 @@ Substraction::Substraction(vtkImageData* imageData1,vtkImageData* imageData2, in
                mediumColor[1] = 125;
                mediumColor[2] = 125;
        }       
-       if(lColor.size() != NULL)
+       if(lColor.size() != 0)
        {
                lowerColor[0] = lColor[0];
                lowerColor[1] = lColor[1];
@@ -44,7 +70,7 @@ Substraction::Substraction(vtkImageData* imageData1,vtkImageData* imageData2, in
        }
        
        //Original image type this case is an unsigned char (3)
-       int t=imageData1->GetScalarType();
+       //int t=imageData1->GetScalarType(); // JPR : unused
        //substracting the image
        substractImage(imageData1, imageData2);
 }
@@ -58,7 +84,6 @@ Substraction::~Substraction()
 // Methods
 //----------------------------------------------------------------------------
 
-
 /*
 Calculate the new image and save it in the attribute imageResult
 it is used if the user had given the imageData
@@ -66,27 +91,27 @@ it is used if the user had given the imageData
 void Substraction::substractImage(vtkImageData* imageData1, vtkImageData* imageData2)
 {
        //dimensions of the image (extent)
-       int ext[6];
+    int ext[6];
        //setting the dimensionality (1d or 2d or 3d )
     int newDim[3];
        //image spacing
     double spc[3];
   
        //getting the information from the original image
-       imageData1->GetSpacing(spc);
-       imageData1->GetExtent(ext);
+    imageData1->GetSpacing(spc);
+    imageData1->GetExtent(ext);
        
        //this a 2d image
-       newDim[0]=ext[1]-ext[0]+1;
+    newDim[0]=ext[1]-ext[0]+1;
     newDim[1]=ext[3]-ext[2]+1;
     newDim[2]=1;// in general it is ext[5]-ext[4]+1
 
 
-       imageType = imageData1->GetScalarType();
+    imageType = imageData1->GetScalarType();
        //initializing the image that represents the substracted image
-       initialize(newDim,spc);
+    initialize(newDim,spc);
        //Time to substract
-       substract(imageData1, imageData2);      
+    substract(imageData1, imageData2); 
 }
 
 /*
@@ -116,74 +141,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                char* dataImagePointer1=NULL;
                char* dataImagePointer2=NULL;
                char* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(char*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(char*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(char*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(char*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(char*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(char*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(char) lowerColor[0];
-                                               dataImageResultPointer[1] =(char) lowerColor[1];
-                                               dataImageResultPointer[2] =(char) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(char) upperColor[0];
-                                               dataImageResultPointer[1] =(char) upperColor[1];
-                                               dataImageResultPointer[2] =(char) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(char) mediumColor[0];
-                                               dataImageResultPointer[1] =(char) mediumColor[1];
-                                               dataImageResultPointer[2] =(char) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_UNSIGNED_CHAR)
        {
@@ -194,74 +153,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                unsigned char* dataImagePointer1=NULL;
                unsigned char* dataImagePointer2=NULL;
                unsigned char* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(unsigned char*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(unsigned char*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(unsigned char*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(unsigned char*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(unsigned char*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(unsigned char*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned char) lowerColor[0];
-                                               dataImageResultPointer[1] =(unsigned char) lowerColor[1];
-                                               dataImageResultPointer[2] =(unsigned char) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned char) upperColor[0];
-                                               dataImageResultPointer[1] =(unsigned char) upperColor[1];
-                                               dataImageResultPointer[2] =(unsigned char) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(unsigned char) mediumColor[0];
-                                               dataImageResultPointer[1] =(unsigned char) mediumColor[1];
-                                               dataImageResultPointer[2] =(unsigned char) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }               
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_SIGNED_CHAR)
        {
@@ -272,74 +165,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                signed char* dataImagePointer1=NULL;
                signed char* dataImagePointer2=NULL;
                signed char* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(signed char*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(signed char*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(signed char*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(signed char*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(signed char*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(signed char*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(signed char) lowerColor[0];
-                                               dataImageResultPointer[1] =(signed char) lowerColor[1];
-                                               dataImageResultPointer[2] =(signed char) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(signed char) upperColor[0];
-                                               dataImageResultPointer[1] =(signed char) upperColor[1];
-                                               dataImageResultPointer[2] =(signed char) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(signed char) mediumColor[0];
-                                               dataImageResultPointer[1] =(signed char) mediumColor[1];
-                                               dataImageResultPointer[2] =(signed char) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_SHORT)
        {
@@ -350,74 +177,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                short* dataImagePointer1=NULL;
                short* dataImagePointer2=NULL;
                short* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(short*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(short*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(short*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
 
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(short*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(short*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(short*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(short) lowerColor[0];
-                                               dataImageResultPointer[1] =(short) lowerColor[1];
-                                               dataImageResultPointer[2] =(short) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(short) upperColor[0];
-                                               dataImageResultPointer[1] =(short) upperColor[1];
-                                               dataImageResultPointer[2] =(short) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(short) mediumColor[0];
-                                               dataImageResultPointer[1] =(short) mediumColor[1];
-                                               dataImageResultPointer[2] =(short) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);          
        }
        else if(imageType == VTK_UNSIGNED_SHORT)
        {
@@ -428,74 +189,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                unsigned short* dataImagePointer1=NULL;
                unsigned short* dataImagePointer2=NULL;
                unsigned short* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(unsigned short*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(unsigned short*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(unsigned short*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(unsigned short*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(unsigned short*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(unsigned short*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned short) lowerColor[0];
-                                               dataImageResultPointer[1] =(unsigned short) lowerColor[1];
-                                               dataImageResultPointer[2] =(unsigned short) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned short) upperColor[0];
-                                               dataImageResultPointer[1] =(unsigned short) upperColor[1];
-                                               dataImageResultPointer[2] =(unsigned short) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(unsigned short) mediumColor[0];
-                                               dataImageResultPointer[1] =(unsigned short) mediumColor[1];
-                                               dataImageResultPointer[2] =(unsigned short) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }               
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_INT)
        {
@@ -506,74 +201,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                int* dataImagePointer1=NULL;
                int* dataImagePointer2=NULL;
                int* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(int*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(int*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(int*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(int*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(int*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(int*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(int) lowerColor[0];
-                                               dataImageResultPointer[1] =(int) lowerColor[1];
-                                               dataImageResultPointer[2] =(int) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(int) upperColor[0];
-                                               dataImageResultPointer[1] =(int) upperColor[1];
-                                               dataImageResultPointer[2] =(int) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(int) mediumColor[0];
-                                               dataImageResultPointer[1] =(int) mediumColor[1];
-                                               dataImageResultPointer[2] =(int) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_UNSIGNED_INT)
        {
@@ -584,74 +213,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                unsigned int* dataImagePointer1=NULL;
                unsigned int* dataImagePointer2=NULL;
                unsigned int* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(unsigned int*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(unsigned int*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(unsigned int*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(unsigned int*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(unsigned int*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(unsigned int*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned int) lowerColor[0];
-                                               dataImageResultPointer[1] =(unsigned int) lowerColor[1];
-                                               dataImageResultPointer[2] =(unsigned int) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned int) upperColor[0];
-                                               dataImageResultPointer[1] =(unsigned int) upperColor[1];
-                                               dataImageResultPointer[2] =(unsigned int) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(unsigned int) mediumColor[0];
-                                               dataImageResultPointer[1] =(unsigned int) mediumColor[1];
-                                               dataImageResultPointer[2] =(unsigned int) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }               
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_LONG)
        {
@@ -662,74 +225,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                long* dataImagePointer1=NULL;
                long* dataImagePointer2=NULL;
                long* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(long*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(long*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(long*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
 
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(long*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(long*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(long*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(long) lowerColor[0];
-                                               dataImageResultPointer[1] =(long) lowerColor[1];
-                                               dataImageResultPointer[2] =(long) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(long) upperColor[0];
-                                               dataImageResultPointer[1] =(long) upperColor[1];
-                                               dataImageResultPointer[2] =(long) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(long) mediumColor[0];
-                                               dataImageResultPointer[1] =(long) mediumColor[1];
-                                               dataImageResultPointer[2] =(long) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_UNSIGNED_LONG)
        {
@@ -740,74 +237,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                unsigned long* dataImagePointer1=NULL;
                unsigned long* dataImagePointer2=NULL;
                unsigned long* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(unsigned long*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(unsigned long*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(unsigned long*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(unsigned long*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(unsigned long*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(unsigned long*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned long) lowerColor[0];
-                                               dataImageResultPointer[1] =(unsigned long) lowerColor[1];
-                                               dataImageResultPointer[2] =(unsigned long) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(unsigned long) upperColor[0];
-                                               dataImageResultPointer[1] =(unsigned long) upperColor[1];
-                                               dataImageResultPointer[2] =(unsigned long) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(unsigned long) mediumColor[0];
-                                               dataImageResultPointer[1] =(unsigned long) mediumColor[1];
-                                               dataImageResultPointer[2] =(unsigned long) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }               
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_FLOAT)
        {
@@ -818,74 +249,8 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                float* dataImagePointer1=NULL;
                float* dataImagePointer2=NULL;
                float* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(float*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(float*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(float*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
-
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
-               {
-                       for(j=0;j<sy;j++)
-                       {
-                               for(k=0;k<sz;k++)
-                               {
-                                       
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(float*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(float*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(float*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(float) lowerColor[0];
-                                               dataImageResultPointer[1] =(float) lowerColor[1];
-                                               dataImageResultPointer[2] =(float) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(float) upperColor[0];
-                                               dataImageResultPointer[1] =(float) upperColor[1];
-                                               dataImageResultPointer[2] =(float) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(float) mediumColor[0];
-                                               dataImageResultPointer[1] =(float) mediumColor[1];
-                                               dataImageResultPointer[2] =(float) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
-                               }
-                       }
-               }
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
        }
        else if(imageType == VTK_DOUBLE)
        {
@@ -896,76 +261,83 @@ void Substraction::substract(vtkImageData* imageData1, vtkImageData* imageData2)
                double* dataImagePointer1=NULL;
                double* dataImagePointer2=NULL;
                double* dataImageResultPointer=NULL;
-               // we start where the  image starts
-               dataImagePointer1=(double*)imageData1->GetScalarPointer(0,0,0);
-               dataImagePointer2=(double*)imageData2->GetScalarPointer(0,0,0);
-               dataImageResultPointer=(double*)imageResult->GetScalarPointer(0,0,0);
-       
-               /*
-               Image Size
-               */
-               int ext[6];
-               imageData1->GetExtent(ext);
-               int sx,sy,sz;
-               sx=ext[1]-ext[0]+1;
-               sy=ext[3]-ext[2]+1;
-               sz=ext[5]-ext[4]+1;
-
-               sizeImage=sx*sy*sz;
+               
+               substractByType(dataImagePointer1, dataImagePointer2, dataImageResultPointer, imageData1, imageData2);
+       }
+}
 
-               //-----------------
-               //A3    
-               //-----------------
-               //walking in the image
-               int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
-               double sum1=0,sum2=0;
-               for(i=0;i<sx;i++)
+template <class T> 
+void Substraction::substractByType(T* dataImagePointer1, T* dataImagePointer2, T* dataImageResultPointer, vtkImageData *imageData1, vtkImageData *imageData2)
+{
+       // we start where the  image starts
+       dataImagePointer1=(T*)imageData1->GetScalarPointer(0,0,0);
+       dataImagePointer2=(T*)imageData2->GetScalarPointer(0,0,0);
+       dataImageResultPointer=(T*)imageResult->GetScalarPointer(0,0,0);
+       /*
+       Image Size
+       */
+       int ext[6];
+       imageData1->GetExtent(ext);
+       int sx,sy,sz;
+       sx=ext[1]-ext[0]+1;
+       sy=ext[3]-ext[2]+1;
+       sz=ext[5]-ext[4]+1;
+
+       sizeImage=sx*sy*sz;
+       //-----------------
+       //A3    
+       //-----------------
+       //walking in the image
+       int i=0,j=0,k=0,counter=0,nU=0,nL=0,nZ=0;
+       double sum1=0,sum2=0;
+       for(i=0;i<sx;i++)
+       {
+               for(j=0;j<sy;j++)
                {
-                       for(j=0;j<sy;j++)
+                       for(k=0;k<sz;k++)
                        {
-                               for(k=0;k<sz;k++)
-                               {
                                        
-                                       // this is for getting just the grey level in that position
-                                       //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
-                               
-                                       // we get the pointer to the position (i,j,k)y that way we can get the 
-                                       //grey level and we can change it
-                                       dataImagePointer1=(double*)imageData1->GetScalarPointer(i,j,k);
-                                       dataImagePointer2=(double*)imageData2->GetScalarPointer(i,j,k);
-                                       dataImageResultPointer=(double*)imageResult->GetScalarPointer(i,j,k);
-
-                                       sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
-                                       sum1=sum1/3;
-                                       sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
-                                       sum2=sum2/3;                            
-                                       if((sum1 - sum2) < lZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(double) lowerColor[0];
-                                               dataImageResultPointer[1] =(double) lowerColor[1];
-                                               dataImageResultPointer[2] =(double) lowerColor[2];
-                                               nL++;
-                                       }
-                                       else if((sum1 - sum2) > uZeroLevel)
-                                       {
-                                               dataImageResultPointer[0] =(double) upperColor[0];
-                                               dataImageResultPointer[1] =(double) upperColor[1];
-                                               dataImageResultPointer[2] =(double) upperColor[2];
-                                               nU++;
-                                       }
-                                       else
-                                       {
-                                               dataImageResultPointer[0] =(double) mediumColor[0];
-                                               dataImageResultPointer[1] =(double) mediumColor[1];
-                                               dataImageResultPointer[2] =(double) mediumColor[2];
-                                               nZ++;
-                                       }                               
-                                       counter++;
+                               // this is for getting just the grey level in that position
+                               //originalValue=(short)imageData->GetScalarComponentAsFloat(i,j,k,0);
+               
+                               // we get the pointer to the position (i,j,k)y that way we can get the 
+                               //grey level and we can change it
+
+                               dataImagePointer1=(T*)imageData1->GetScalarPointer(i,j,k);
+                               dataImagePointer2=(T*)imageData2->GetScalarPointer(i,j,k);
+                               dataImageResultPointer=(T*)imageResult->GetScalarPointer(i,j,k);
+
+                               sum1=(int)(dataImagePointer1[0]) + (int)(dataImagePointer1[1]) + (int)(dataImagePointer1[2]);
+                               sum1=sum1/3;
+                               sum2=(int)(dataImagePointer2[0]) + (int)(dataImagePointer2[1]) + (int)(dataImagePointer2[2]);
+                               sum2=sum2/3;                            
+                               if((sum1 - sum2) < lZeroLevel)
+                               {
+                                       dataImageResultPointer[0] =(T) lowerColor[0];
+                                       dataImageResultPointer[1] =(T) lowerColor[1];
+                                       dataImageResultPointer[2] =(T) lowerColor[2];
+                                       nL++;
                                }
+                               else if((sum1 - sum2) > uZeroLevel)
+                               {
+                                       dataImageResultPointer[0] =(T) upperColor[0];
+                                       dataImageResultPointer[1] =(T) upperColor[1];
+                                       dataImageResultPointer[2] =(T) upperColor[2];
+                                       nU++;
+                               }
+                               else
+                               {
+                                       dataImageResultPointer[0] =(T) mediumColor[0];
+                                       dataImageResultPointer[1] =(T) mediumColor[1];
+                                       dataImageResultPointer[2] =(T) mediumColor[2];
+                                       nZ++;
+                               }                               
+                               counter++;
                        }
                }
        }
 }
+
 /*
 Returns the filtered image
 */
@@ -980,4 +352,4 @@ vtkImageData* Substraction::getSubstractedImage()
 int Substraction::getImageSize()
 { 
        return sizeImage;
-}
\ No newline at end of file
+}