]> Creatis software - creaRigidRegistration.git/blobdiff - lib/Transparency.cxx
Added Transparency and Checkboard Libraries
[creaRigidRegistration.git] / lib / Transparency.cxx
diff --git a/lib/Transparency.cxx b/lib/Transparency.cxx
new file mode 100644 (file)
index 0000000..0cf822d
--- /dev/null
@@ -0,0 +1,410 @@
+#include "Transparency.h"
+
+
+/*
+* Constructor
+*/
+//------------------------------------------------------------
+Transparency::Transparency()
+{
+       _image1=NULL;
+       _image2=NULL;
+       _percent=0;
+       _newImage = NULL;
+       _processed=false;
+}
+
+/*
+* Destructor
+*/
+//------------------------------------------------------------
+Transparency::~Transparency()
+{
+       if (_newImage != NULL ) { _newImage->Delete(); }
+}
+
+//------------------------------------------------------------
+void Transparency::calculateImage()
+{
+
+       if(_image1!=NULL && _image2!=NULL)
+       {
+
+               // IMAGE 1
+                       
+               // Information from image1
+               _image1->GetSpacing(spcImg1);
+               _image1->GetExtent(extImg1);
+               _type = _image1->GetScalarType();
+               
+               // The Z dimension is 1 for a 2D image
+               dimImg1[0] = extImg1[1] - extImg1[0]+1;
+               dimImg1[1] = extImg1[3] - extImg1[2]+1;
+               dimImg1[2] = 1;
+
+               //IMAGE 2
+
+               // Information from image2
+               _image2->GetSpacing(spcImg2);
+               _image2->GetExtent(extImg2);
+               
+               // The Z dimension is 1 for a 2D image
+               dimImg2[0] = extImg2[1] - extImg2[0]+1;
+               dimImg2[1] = extImg2[3] - extImg2[2]+1;
+               dimImg2[2] = 1;
+
+               long numPixelsImg1 = dimImg1[0]*dimImg1[1];
+               long numPixelsImg2 = dimImg2[0]*dimImg2[1];
+               
+               double factorX = 1;
+               double factorY = 1;
+               vtkImageResample *resample = vtkImageResample::New();
+               vtkImageData *result;
+               if(numPixelsImg1<numPixelsImg2)
+               {
+                       resample->SetInput(_image1);
+                       factorX = (double)extImg2[1]/extImg1[1];
+                       factorY = (double)extImg2[3]/extImg1[3];
+                       resample->SetAxisMagnificationFactor(0,factorX);
+                       resample->SetAxisMagnificationFactor(1,factorY);
+                       resample->SetInformationInput(_image2);
+
+                       initialize(dimImg2, spcImg2);
+                       result = resample->GetOutput();
+                       result->Update();
+                       createImage(result,_image2,dimImg2[0],dimImg2[1]);              
+                       
+               } //if
+               else if (numPixelsImg1>numPixelsImg2)
+               {
+                       resample->SetInput(_image2);
+                       factorX = (double)extImg1[1]/extImg2[1];
+                       factorY = (double)extImg1[3]/extImg2[3];
+                       resample->SetAxisMagnificationFactor(0,factorX);
+                       resample->SetAxisMagnificationFactor(1,factorY);
+                       resample->SetInformationInput(_image1);
+
+                       initialize(dimImg1, spcImg1);
+                       result = resample->GetOutput();
+                       
+                       result->Update();
+
+                       createImage(_image1,result,dimImg1[0],dimImg1[1]);
+               } // else if
+               else
+               {
+                       //If both images have the same number of pixels, the resultant image will have the 
+                       //properties of the first image.
+                       resample->SetInput(_image2);
+                       factorX = (double)extImg1[1]/extImg2[1];
+                       factorY = (double)extImg1[3]/extImg2[3];
+                       resample->SetAxisMagnificationFactor(0,factorX);
+                       resample->SetAxisMagnificationFactor(1,factorY);
+                       resample->SetInformationInput(_image1);
+
+                       initialize(dimImg1, spcImg1);
+
+                       result = resample->GetOutput();
+                       result->Update();
+                       
+                       createImage(_image1,result,dimImg1[0],dimImg1[1]);
+
+               } //else
+               
+               resample->Delete();             
+               _processed=true;
+       }
+}
+
+void Transparency::initialize(int dimensions[], double spacing[])
+{
+       // Setting the new image
+       _newImage = vtkImageData::New();
+       _newImage->SetScalarType(_type);
+       _newImage->SetSpacing(spacing);
+       _newImage->SetDimensions(dimensions);
+       _newImage->AllocateScalars();
+       _newImage->Update();
+
+}
+
+void Transparency::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
+{
+       int i, j;
+       if(_type == VTK_CHAR)
+       {
+               //POINTERS: 
+               char* dataImagePointer1 = NULL;
+               char* dataImagePointer2 = NULL;
+               char* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (char*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (char*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (char*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (char*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (char*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (char*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (char)*dataImagePointer1*_percent + (char)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_SIGNED_CHAR)
+       {
+               //POINTERS: 
+               signed char* dataImagePointer1 = NULL;
+               signed char* dataImagePointer2 = NULL;
+               signed char* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (signed char*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (signed char*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (signed char*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (signed char*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (signed char*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (signed char*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (signed char)*dataImagePointer1*_percent + (signed char)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_UNSIGNED_CHAR)
+       {
+               //POINTERS: 
+               unsigned char* dataImagePointer1 = NULL;
+               unsigned char* dataImagePointer2 = NULL;
+               unsigned char* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (unsigned char*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (unsigned char*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (unsigned char*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (unsigned char*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (unsigned char*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (unsigned char*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (unsigned char)*dataImagePointer1*_percent + (unsigned char)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_SHORT)
+       {
+               //POINTERS: 
+               short* dataImagePointer1 = NULL;
+               short* dataImagePointer2 = NULL;
+               short* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (short*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (short*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (short*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (short*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (short*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (short*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (short)*dataImagePointer1*_percent + (short)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_UNSIGNED_SHORT)
+       {
+               //POINTERS: 
+               unsigned short* dataImagePointer1 = NULL;
+               unsigned short* dataImagePointer2 = NULL;
+               unsigned short* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (unsigned short*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (unsigned short*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (unsigned short*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (unsigned short*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (unsigned short*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (unsigned short*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (unsigned short)*dataImagePointer1*_percent + (unsigned short)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_INT)
+       {
+               //POINTERS: 
+               int* dataImagePointer1 = NULL;
+               int* dataImagePointer2 = NULL;
+               int* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (int*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (int*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (int*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (int*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (int*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (int*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (int)*dataImagePointer1*_percent + (int)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_UNSIGNED_INT)
+       {
+               //POINTERS: 
+               unsigned int* dataImagePointer1 = NULL;
+               unsigned int* dataImagePointer2 = NULL;
+               unsigned int* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (unsigned int*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (unsigned int*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (unsigned int*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (unsigned int*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (unsigned int*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (unsigned int*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (unsigned int)*dataImagePointer1*_percent + (unsigned int)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_LONG)
+       {
+               //POINTERS: 
+               long* dataImagePointer1 = NULL;
+               long* dataImagePointer2 = NULL;
+               long* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (long*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (long*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (long*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (long*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (long*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (long*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (long)*dataImagePointer1*_percent + (long)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_UNSIGNED_LONG)
+       {
+               //POINTERS: 
+               unsigned long* dataImagePointer1 = NULL;
+               unsigned long* dataImagePointer2 = NULL;
+               unsigned long* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (unsigned long*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (unsigned long*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (unsigned long*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (unsigned long*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (unsigned long*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (unsigned long*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (unsigned long)*dataImagePointer1*_percent + (unsigned long)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_FLOAT)
+       {
+               //POINTERS: 
+               float* dataImagePointer1 = NULL;
+               float* dataImagePointer2 = NULL;
+               float* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (float*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (float*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (float*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (float*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (float*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (float*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (float)*dataImagePointer1*_percent + (float)*dataImagePointer2*(1-_percent);
+                       }
+               }
+       }
+       else if(_type == VTK_DOUBLE)
+       {
+               //POINTERS: 
+               double* dataImagePointer1 = NULL;
+               double* dataImagePointer2 = NULL;
+               double* dataImageResultPointer = NULL;
+       
+               dataImagePointer1 = (double*) img1->GetScalarPointer(0,0,0);
+               dataImagePointer2 = (double*) img2->GetScalarPointer(0,0,0);
+               dataImageResultPointer = (double*) _newImage->GetScalarPointer(0,0,0);
+               for(i = 0; i < sizeX; i++)
+               {
+                       for(j = 0; j < sizeY; j++)
+                       {
+                               dataImagePointer1 = (double*)img1->GetScalarPointer(i,j,0);
+                               dataImagePointer2 = (double*)img2->GetScalarPointer(i,j,0);
+                               dataImageResultPointer = (double*)_newImage->GetScalarPointer(i,j,0);
+                               
+                               *dataImageResultPointer = (double)*dataImagePointer1*_percent + (double)*dataImagePointer2*(1-_percent);                                
+                       }
+               }
+       }
+
+       _newImage->Update();
+}
+
+/*
+* Get new image
+*/
+//------------------------------------------------------------
+vtkImageData* Transparency::getImage()
+{
+       if(_processed){
+               return _newImage;
+       }
+       else{
+               return NULL;
+       }
+}
+
+//------------------------------------------------------------
+void Transparency::setImage1(vtkImageData *image)
+{
+       _image1=image;
+}
+
+//------------------------------------------------------------
+void Transparency::setImage2(vtkImageData *image)
+{
+       _image2=image;
+}
+
+//------------------------------------------------------------
+void Transparency::setPercent(int percent)
+{
+    _percent=(double)percent/100.0;    
+}
\ No newline at end of file