--- /dev/null
+/*=========================================================================
+ 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_
--- /dev/null
+/*=========================================================================
+ 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_