]> Creatis software - clitk.git/blobdiff - common/vvImage.cxx
Added Manual Registration Tool with updated Median Filter tool
[clitk.git] / common / vvImage.cxx
index 8bb06f1178ba1c9a1702958612cdffc4c4fbfb61..2a47a99d6463989ff9157009aa6057f87f509b0a 100644 (file)
-#ifndef VVIMAGE_CXX
-#define VVIMAGE_CXX
-
-/*-------------------------------------------------------------------------
-
-  Program:   vv
-  Language:  C++
-  Author :   Pierre Seroul (pierre.seroul@gmail.com)
-
-  Copyright (C) 2008
-  Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
-  CREATIS-LRMN http://www.creatis.insa-lyon.fr
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, version 3 of the License.
+/*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
+  Authors belong to: 
+  - University of LYON              http://www.universite-lyon.fr/
+  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the copyright notices for more information.
 
-  -------------------------------------------------------------------------*/
+  It is distributed under dual licence
 
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+======================================================================-====*/
+#ifndef VVIMAGE_CXX
+#define VVIMAGE_CXX
 #include "vvImage.h"
-#include "vtkImageData.h"
 #include "clitkCommon.h"
+#include <vtkTransform.h>
+#include <vtkImageData.h>
+#include <vtkImageReslice.h>
 #include <cassert>
 
 //--------------------------------------------------------------------
 vvImage::vvImage() {
-  mVtkImages.resize(0);
+  Init();
 }
 //--------------------------------------------------------------------
 
 
 //--------------------------------------------------------------------
-vvImage::~vvImage() {
-  for (unsigned int i = 0; i < mVtkImages.size(); i++) {
-    if (mVtkImages[i] != NULL)
-      mVtkImages[i]->Delete();
-  }
+void vvImage::Init() {
+    mTimeSpacing = 1;
+    mTimeOrigin = 0;
+    
+    if (CLITK_EXPERIMENTAL)
+    {
+        mVtkImageReslice = vtkSmartPointer<vtkImageReslice>::New();
+       transform = vtkSmartPointer<vtkTransform>::New();  
+        mVtkImageReslice->SetInterpolationModeToLinear();
+        mVtkImageReslice->AutoCropOutputOn();
+       mVtkImageReslice->SetBackgroundColor(-1000,-1000,-1000,1);
+       mVtkImageReslice->SetResliceTransform(transform);
+    }
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
-void vvImage::SetImage(std::vector<vtkImageData*> images) {
-  for (unsigned int i = 0; i < mVtkImages.size(); i++) {
-    if (mVtkImages[i] != NULL)
-      mVtkImages[i]->Delete();
-  }
-  mVtkImages.resize(0);
-  for (unsigned int i = 0; i < images.size(); i++) {
-    mVtkImages.push_back(images[i]);
-  }
+vvImage::~vvImage() {
+    Reset();
 }
 //--------------------------------------------------------------------
 
 //--------------------------------------------------------------------
-void vvImage::AddImage(vtkImageData* image) {
-  mVtkImages.push_back(image);
+void vvImage::Reset() {
+    if (CLITK_EXPERIMENTAL)
+    {
+        for (unsigned int i = 0; i < mVtkImages.size(); i++)
+            mVtkImages[i] = (vtkImageData*)mVtkImageReslice->GetInput(i);
+        mVtkImageReslice->RemoveAllInputs();
+    }
+    for (unsigned int i = 0; i < mVtkImages.size(); i++)
+        mVtkImages[i]->Delete();
+    mVtkImages.resize(0);
+    Init();
 }
 //--------------------------------------------------------------------
 
+
 //--------------------------------------------------------------------
-void vvImage::Init() {
-  for (unsigned int i = 0; i < mVtkImages.size(); i++) {
-    if (mVtkImages[i] != NULL)
-      mVtkImages[i]->Delete();
-  }
-  mVtkImages.resize(0);
+void vvImage::SetImage(std::vector< vtkImageData* > images) {
+    Reset();
+    for (unsigned int i = 0; i < images.size(); i++)
+        AddImage(images[i]);
 }
 //--------------------------------------------------------------------
 
 
 //--------------------------------------------------------------------
-int vvImage::GetNumberOfSpatialDimensions() {
-  int dim=GetNumberOfDimensions();
-  if (IsTimeSequence())
-    return dim-1;
-  else
-    return dim;
+void vvImage::AddImage(vtkImageData* image) {
+    if (CLITK_EXPERIMENTAL)
+    {
+        mVtkImageReslice->SetInput(mVtkImages.size(), image);
+        mVtkImageReslice->Update();
+        mVtkImages.push_back( mVtkImageReslice->GetOutput( mVtkImages.size() ) );
+    }
+    else
+        mVtkImages.push_back(image);
 }
 //--------------------------------------------------------------------
 
-
+//--------------------------------------------------------------------
+int vvImage::GetNumberOfSpatialDimensions() {
+    int dim=GetNumberOfDimensions();
+    if (IsTimeSequence())
+        return dim-1;
+    else
+        return dim;
+}
+//--------------------------------------------------------------------
+//
 //--------------------------------------------------------------------
 int vvImage::GetNumberOfDimensions() const {
-  if (mVtkImages.size())
+    if (mVtkImages.size())
     {
-      int dimension = 2;
-      int extent[6];
-      mVtkImages[0]->GetWholeExtent(extent);
-      if (extent[5] - extent[4] >= 1)
-        dimension++;
-      if (mVtkImages.size() > 1)
-        dimension++;
-      return dimension;
+        int dimension = 2;
+        int extent[6];
+        mVtkImages[0]->GetWholeExtent(extent);
+        if (extent[5] - extent[4] >= 1)
+            dimension++;
+        if (mVtkImages.size() > 1)
+            dimension++;
+        return dimension;
     }
-  return 0;
+    return 0;
 }
-//--------------------------------------------------------------------
-
-
 //--------------------------------------------------------------------
 void vvImage::GetScalarRange(double* range)
 {
-  assert(mVtkImages.size());
-  double * temp = mVtkImages[0]->GetScalarRange();
-  range[0]=temp[0];range[1]=temp[1];
-  for (unsigned int i=1;i<mVtkImages.size();i++)
+    assert(mVtkImages.size());
+    double * temp = mVtkImages[0]->GetScalarRange();
+    range[0]=temp[0];range[1]=temp[1];
+    for (unsigned int i=1;i<mVtkImages.size();i++)
     {
-      temp = mVtkImages[i]->GetScalarRange();
-      if (temp[0] < range[0]) range[0]=temp[0];
-      if (temp[1] > range[1]) range[1]=temp[1];
+        temp = mVtkImages[i]->GetScalarRange();
+        if (temp[0] < range[0]) range[0]=temp[0];
+        if (temp[1] > range[1]) range[1]=temp[1];
     }
 }
-//--------------------------------------------------------------------
-
 
 //--------------------------------------------------------------------
 std::string vvImage::GetScalarTypeAsString() {
-  // WARNING VTK pixel type different from ITK Pixel type
-  std::string vtktype = mVtkImages[0]->GetScalarTypeAsString();
-  if (vtktype == "unsigned char") return "unsigned_char";
-  if (vtktype == "unsigned short") return "unsigned_short";
-  if (vtktype == "unsigned int") return "unsigned_int";
-  return vtktype;
+    return mVtkImages[0]->GetScalarTypeAsString();
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 int vvImage::GetNumberOfScalarComponents() {
-  return mVtkImages[0]->GetNumberOfScalarComponents();
+    return mVtkImages[0]->GetNumberOfScalarComponents();
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 int vvImage::GetScalarSize() {
-  return mVtkImages[0]->GetScalarSize();
+    return mVtkImages[0]->GetScalarSize();
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 std::vector<double> vvImage::GetSpacing() {
-  std::vector<double> spacing;
-  int dim = this->GetNumberOfDimensions();
-  for (int i = 0; i < dim; i++)
+    std::vector<double> spacing;
+    int dim = this->GetNumberOfDimensions();
+    for (int i = 0; i < dim; i++)
     {
+        if (i == 3)
+            spacing.push_back(1);
+        else
+            spacing.push_back(mVtkImages[0]->GetSpacing()[i]);
       if (i == 3)
-        spacing.push_back(1);
+        spacing.push_back(mTimeSpacing);
       else
         spacing.push_back(mVtkImages[0]->GetSpacing()[i]);
     }
-  return spacing;
+    return spacing;
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 std::vector<double> vvImage::GetOrigin() const {
-  std::vector<double> origin;
-  int dim = this->GetNumberOfDimensions();
-  for (int i = 0; i < dim; i++)
+    std::vector<double> origin;
+    int dim = this->GetNumberOfDimensions();
+    for (int i = 0; i < dim; i++)
     {
+        if (i == 3)
+            origin.push_back(0);
+        else
+            origin.push_back(mVtkImages[0]->GetOrigin()[i]);
       if (i == 3)
-        origin.push_back(0);
+        origin.push_back(mTimeOrigin);
       else
         origin.push_back(mVtkImages[0]->GetOrigin()[i]);
     }
-  return origin;
+    return origin;
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 std::vector<int> vvImage::GetSize() {
-  std::vector<int> size0;
-  int dim = this->GetNumberOfDimensions();
-  for (int i = 0; i < dim; i++)
+    std::vector<int> size0;
+    int dim = this->GetNumberOfDimensions();
+    for (int i = 0; i < dim; i++)
     {
-      if (i == 3)
-        size0.push_back(mVtkImages.size());
-      else
-        size0.push_back(mVtkImages[0]->GetDimensions()[i]);
+        if (i == 3)
+            size0.push_back(mVtkImages.size());
+        else
+            size0.push_back(mVtkImages[0]->GetDimensions()[i]);
     }
-  return size0;
+    return size0;
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 unsigned long vvImage::GetActualMemorySize() {
-  unsigned long size = 0;
-  for (unsigned int i = 0; i < mVtkImages.size(); i++) {
-    size += mVtkImages[i]->GetActualMemorySize();
-  }
-  return size;
+    unsigned long size = 0;
+    for (unsigned int i = 0; i < mVtkImages.size(); i++) {
+        size += mVtkImages[i]->GetActualMemorySize();
+    }
+    return size;
 }
 //--------------------------------------------------------------------
 
@@ -236,7 +242,6 @@ bool vvImage::IsScalarTypeInteger() {
 }
 //--------------------------------------------------------------------
 
-
 //--------------------------------------------------------------------
 bool vvImage::IsScalarTypeInteger(int t) {
   if ((t == VTK_BIT) ||
@@ -254,7 +259,98 @@ bool vvImage::IsScalarTypeInteger(int t) {
     return false;
   }
 }
+
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+
+void vvImage::SetVTKImageReslice(vtkImageReslice* reslice) {
+   mVtkImageReslice=reslice;
+    
+}
 //--------------------------------------------------------------------
 
+//--------------------------------------------------------------------
+vtkAbstractTransform * vvImage::GetTransform()
+{
+    return mVtkImageReslice->GetResliceTransform();
+}
+//--------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+void vvImage::SetRotateX(int xvalue)
+{
+    transform->PostMultiply();
+    transform->Translate(-origin[0],-origin[1],-origin[2]);
+    transform->RotateX(xvalue);
+    transform->Translate(origin[0],origin[1],origin[2]);
+     mVtkImageReslice->Update();
+}
+
+//--------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+void vvImage::SetRotateY(int yvalue)
+{
+    transform->PostMultiply();
+    transform->Translate(-origin[0],-origin[1],-origin[2]);
+    transform->RotateY(yvalue);
+    transform->Translate(origin[0],origin[1],origin[2]);
+     mVtkImageReslice->Update();
+}
+//--------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+void vvImage::SetRotateZ(int zvalue)
+{
+    transform->PostMultiply();
+    transform->Translate(-origin[0],-origin[1],-origin[2]);
+    transform->RotateZ(zvalue);
+    transform->Translate(origin[0],origin[1],origin[2]);
+     mVtkImageReslice->Update();
+}
+//--------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+void vvImage::SetTranslationX(int xvalue)
+{ 
+    transform->Translate(xvalue,0,0);
+     mVtkImageReslice->Update();
+}
+//--------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+
+void vvImage::SetTranslationY(int yvalue)
+{ 
+    transform->Translate(0,yvalue,0);
+     mVtkImageReslice->Update();
+}
+//--------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+void vvImage::SetTranslationZ(int zvalue)
+{ 
+    transform->Translate(0,0,zvalue);
+     mVtkImageReslice->Update();
+}
+//-------------------------------------------------------------------
+
+//-------------------------------------------------------------------
+void vvImage::SetOrigin(double value[3])
+{  
+  origin=new double[mVtkImageReslice->GetOutputDimensionality()];
+  origin[0]=value[0];
+  origin[1]=value[1];
+  origin[2]=value[2];
+}
+
+//--------------------------------------------------------------------
+void vvImage::SetTransform(vtkAbstractTransform  *transform)
+{
+  mVtkImageReslice->SetResliceTransform(transform);
+  mVtkImageReslice->Update();
+}
+//--------------------------------------------------------------------
 
 #endif // VVIMAGE_CXX