+/*
+# ---------------------------------------------------------------------
+#
+# 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)
sizeImage=0;
uZeroLevel=uZLevel;
lZeroLevel=lZLevel;
- if(uColor.size() != NULL)
+ if(uColor.size() != 0)
{
upperColor[0] = uColor[0];
upperColor[1] = uColor[1];
upperColor[1] = 255;
upperColor[2] = 255;
}
- if(mColor.size() != NULL)
+ if(mColor.size() != 0)
{
mediumColor[0] = mColor[0];
mediumColor[1] = mColor[1];
mediumColor[1] = 125;
mediumColor[2] = 125;
}
- if(lColor.size() != NULL)
+ if(lColor.size() != 0)
{
lowerColor[0] = lColor[0];
lowerColor[1] = lColor[1];
}
//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);
}
// Methods
//----------------------------------------------------------------------------
-
/*
Calculate the new image and save it in the attribute imageResult
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);
}
/*
void Substraction::initialize(int dimensions[], double spacing[])
{
//setting image data of the imageResult
- imageResult->SetScalarType(imageType);
imageResult->SetSpacing(spacing);
imageResult->SetDimensions(dimensions);
+//EED 2017-01-01 Migration VTK7
+#if VTK_MAJOR_VERSION <= 5
+ imageResult->SetScalarType(imageType);
imageResult->AllocateScalars();
imageResult->Update();
+#else
+ imageResult->AllocateScalars(imageType,1);
+#endif
+
}
/*
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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)
{
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
*/
int Substraction::getImageSize()
{
return sizeImage;
-}
\ No newline at end of file
+}