]> Creatis software - creaRigidRegistration.git/blobdiff - lib/Substraction.cxx
Fix some warnings
[creaRigidRegistration.git] / lib / Substraction.cxx
index ee25e7039499e38a54ce08ff897c2532b04e3d9c..853e5de3d98c610337725f09f6a0428108f5e4b3 100644 (file)
@@ -6,7 +6,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 +18,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 +30,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];
@@ -116,74 +116,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 +128,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 +140,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 +152,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 +164,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 +176,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 +188,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 +200,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 +212,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 +224,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 +236,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 +327,4 @@ vtkImageData* Substraction::getSubstractedImage()
 int Substraction::getImageSize()
 { 
        return sizeImage;
-}
\ No newline at end of file
+}