]> Creatis software - bbtk.git/commitdiff
UnMosaic Siemens images
authorjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Tue, 5 Oct 2010 14:33:49 +0000 (14:33 +0000)
committerjean-pierre roux <jean-pierre.roux@creatis.insa-lyon.fr>
Tue, 5 Oct 2010 14:33:49 +0000 (14:33 +0000)
packages/vtk/src/bbvtkUnMosaic.cxx [new file with mode: 0644]
packages/vtk/src/bbvtkUnMosaic.h [new file with mode: 0644]

diff --git a/packages/vtk/src/bbvtkUnMosaic.cxx b/packages/vtk/src/bbvtkUnMosaic.cxx
new file mode 100644 (file)
index 0000000..a28daaf
--- /dev/null
@@ -0,0 +1,152 @@
+/*=========================================================================                                                                               
+  Program:   bbtk
+  Module:    $RCSfile: bbvtkUnMosaic.cxx,v $
+  Language:  C++
+  Date:      $Date: 2010/10/05 14:33:49 $
+  Version:   $Revision: 1.1 $
+=========================================================================*/
+
+/* ---------------------------------------------------------------------
+
+* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
+* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
+*
+*  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.
+* ------------------------------------------------------------------------ */                                                                         
+
+/**
+ *  \file 
+ *  \brief 
+ */
+
+#ifdef _USE_VTK_
+#include "bbvtkUnMosaic.h"
+#include "bbvtkPackage.h"
+
+namespace bbvtk
+{
+   BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,UnMosaic)
+   BBTK_BLACK_BOX_IMPLEMENTATION(UnMosaic,bbtk::AtomicBlackBox);
+
+//---------------------------------------------------------------------
+
+   void UnMosaic::bbUserSetDefaultValues() 
+   { 
+      //std::cout << "-------- entree ds UnMosaic::bbUserSetDefaultValues()\n" << std::endl;
+      
+   // bbSetInputIn(NULL);  /// \TODO fix it! IN is a std::vector<vtkImageData> // JPR
+      mImageOut = NULL;
+      bbSetOutputOut(NULL);
+   }
+
+//---------------------------------------------------------------------
+
+   void UnMosaic::bbUserInitializeProcessing() 
+   {
+       //std::cout << "-------- entree ds UnMosaic::bbUserInitalizeProcessing()\n" << std::endl;
+      //bbUserFinalizeProcessing();
+      mImageOut = vtkImageData::New();  // Alloc depends on  bbGetInputIn().size()  
+   }
+  
+//---------------------------------------------------------------------
+
+   void UnMosaic::bbUserFinalizeProcessing() 
+   {
+            //std::cout << "-------- entree ds UnMosaic::bbUserFinalizeProcessing()\n" << std::endl;
+   // WTF? we never enter here // JPR  bbUserFinalizeProcessing()  JPR 
+      if (mImageOut!=NULL)
+      {
+        // mImageOut->Delete();
+        // mImageOut=NULL;
+      }
+      bbSetOutputOut(mImageOut);          
+   }
+
+//---------------------------------------------------------------------
+ ///  :
+ ///  - receives a vtkImageData*imageIn, int nbImagesPerRow, int numberOfImagesInMosaic 
+ ///  - exports a vtkImageData* as a3D image
+ ///  - supposes the input image is a 2D Siemens Mosaic
+ ///
+   void UnMosaic::Process()
+   {
+
+       int nbImagesPerRow =   (unsigned int)bbGetInputNbImagesPerRow();
+       int nbImagesInMosaic = (unsigned int)bbGetInputNbImagesInMosaic();      
+
+        if (nbImagesPerRow == 0 || nbImagesInMosaic == 0) {
+          std::cout << "Go away!" << std::endl; // ??? JPR
+          // exit(0);
+       }
+       
+       vtkImageData* imageIn = bbGetInputIn();
+       
+       vtkImageData * mImageOut = unMosaic(imageIn, nbImagesPerRow, nbImagesInMosaic);
+      
+   // Devrait etre dans bbUserFinalizeProcessing() ? // JPR    
+        bbSetOutputOut(mImageOut);     
+   }
+
+
+vtkImageData * unMosaic(vtkImageData *imageIn, int nbImagesPerRow, int numberOfImagesInMosaic)
+{   
+   int inputdims[3];
+   int outputdims[3];
+   imageIn->GetDimensions (inputdims);
+   unsigned short *input = (unsigned short *)(imageIn->GetScalarPointer());
+   imageIn->Update();
+     
+   unsigned int div = (unsigned int)ceil(sqrt( (double)numberOfImagesInMosaic ) );
+   outputdims[0] = inputdims[0] / div;
+   outputdims[1] = inputdims[1] / div;
+   outputdims[2] = numberOfImagesInMosaic;
+    vtkImageData *vtkImageOut;
+    vtkImageOut = vtkImageData::New();
+    vtkImageOut->SetDimensions( outputdims );
+    vtkImageOut->SetExtent(0,outputdims[0]-1,0,outputdims[1]-1,0,outputdims[2]-1);
+    vtkImageOut->SetWholeExtent(0,outputdims[0]-1,0,outputdims[1]-1,0,outputdims[2]-1);
+    vtkImageOut->SetNumberOfScalarComponents(1);
+//vtkImageOut->SetSpacing( blabla );
+    vtkImageOut->SetScalarType( VTK_UNSIGNED_SHORT );
+    vtkImageOut->AllocateScalars();
+    vtkImageOut->Update();
+    
+    unsigned short *output =(unsigned short *)(vtkImageOut->GetScalarPointer());
+
+    unsigned short *dest = output;
+    int lgrLigne = outputdims[0];
+    int lgrImage = lgrLigne*outputdims[1]; //*sizeof(unsigned short);
+    int debImage;
+    for (int i=0; i<numberOfImagesInMosaic; i++)
+    {
+       //debImage=(i%nbImagesPerRow) * lgrImage*nbImagesPerRow + (i%nbImagesPerRow)*lgrLigne;
+       debImage=(i/nbImagesPerRow) * lgrImage*nbImagesPerRow + (i%nbImagesPerRow)*lgrLigne;
+       for(int j=0; j<outputdims[1]; j++)
+       {
+          memcpy(dest, input+debImage, lgrLigne*sizeof(unsigned short));
+          debImage += lgrLigne*nbImagesPerRow;
+          dest += lgrLigne;
+       }
+    }
+    return  vtkImageOut;    
+}
+
+}//namespace bbtk
+
+#endif // _USE_VTK_
diff --git a/packages/vtk/src/bbvtkUnMosaic.h b/packages/vtk/src/bbvtkUnMosaic.h
new file mode 100644 (file)
index 0000000..fcf808b
--- /dev/null
@@ -0,0 +1,94 @@
+/*=========================================================================                                                                               
+  Program:   bbtk
+  Module:    $RCSfile: bbvtkUnMosaic.h,v $
+  Language:  C++
+  Date:      $Date: 2010/10/05 14:33:49 $
+  Version:   $Revision: 1.1 $
+=========================================================================*/
+
+/* ---------------------------------------------------------------------
+
+* Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
+* Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
+*
+*  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.
+* ------------------------------------------------------------------------ */                                                                         
+
+/**
+ * \brief Short description in one line
+ * 
+ * Long description which 
+ * can span multiple lines
+ */
+/**
+ * \file 
+ * \brief Pattern for the definition of a new type of Node (header)
+ */
+/**
+ * \class bbtk::NodePatern 
+ * \brief Pattern for the definition of a new type of Node 
+ */
+#ifdef _USE_VTK_
+
+#ifndef __bbvtkUnMosaic_h_INCLUDED__
+#define __bbvtkUnMosaic_h_INCLUDED__
+#include "bbvtk_EXPORT.h"
+
+#include "bbtkAtomicBlackBox.h"
+
+#include "vtkImageData.h"
+
+namespace bbvtk
+{
+  class bbvtk_EXPORT UnMosaic : public bbtk::AtomicBlackBox
+  { 
+  public:
+    BBTK_BLACK_BOX_INTERFACE(UnMosaic, bbtk::AtomicBlackBox);
+    BBTK_DECLARE_INPUT (In,vtkImageData *);
+    BBTK_DECLARE_INPUT (NbImagesPerRow,int);
+    BBTK_DECLARE_INPUT (NbImagesInMosaic,int);       
+    BBTK_DECLARE_OUTPUT(Out, vtkImageData*);    
+    BBTK_PROCESS(Process);
+    void Process();
+  private :
+  vtkImageData * unMosaic(vtkImageData *imageIn, int nbImagesPerRow, int numberOfImagesInMosaic);
+  protected:
+  
+  // Attributes :
+  private:
+     vtkImageData *mImageOut;    
+  };
+
+  //=================================================================
+  // UserBlackBox description
+  BBTK_BEGIN_DESCRIBE_BLACK_BOX(UnMosaic,bbtk::AtomicBlackBox);
+  BBTK_NAME("UnMosaic");
+  BBTK_AUTHOR("jp at creatis.univ-lyon.fr");
+  BBTK_DESCRIPTION("Transforms a 2D (ala Siemens Mosaic) <vtkImageData*> into a 3D vtkImageData");
+  BBTK_CATEGORY("application, image");
+  BBTK_INPUT(UnMosaic, In, "ala Siemens Mosaic 2D image", vtkImageData *, "");
+  BBTK_INPUT(UnMosaic, NbImagesPerRow, "Nb of Images Per Row ", int, ""); 
+  BBTK_INPUT(UnMosaic, NbImagesInMosaic, "Nb of Images In Mosaic ", int, "");   
+  BBTK_OUTPUT(UnMosaic, Out, "3D Image", vtkImageData *, "");
+  BBTK_END_DESCRIBE_BLACK_BOX(UnMosaic);   
+  //=================================================================
+
+}//namespace bbvtk
+   
+#endif  //__bbtvtkUnMosaic_h__
+#endif //_USE_VTK_