]> Creatis software - clitk.git/blobdiff - common/vvImage.cxx
Added Manual Registration Tool with updated Median Filter tool
[clitk.git] / common / vvImage.cxx
index c0c3aa61c683a734854a21b90c17024bfa73b191..2a47a99d6463989ff9157009aa6057f87f509b0a 100644 (file)
@@ -1,83 +1,98 @@
-#ifndef VVIMAGE_CXX
-#define VVIMAGE_CXX
-
 /*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-Program:   vv
-Module:    $RCSfile: vvImage.cxx,v $
-Language:  C++
-Date:      $Date: 2010/01/06 13:32:01 $
-Version:   $Revision: 1.1 $
-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.
+  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
 
-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.
+  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.
 
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-=========================================================================*/
+  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();
+//--------------------------------------------------------------------
+vvImage::~vvImage() {
+    Reset();
+}
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+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);
-    for (unsigned int i = 0; i < images.size(); i++) {
-        mVtkImages.push_back(images[i]);
-    }
+    Init();
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
-void vvImage::AddImage(vtkImageData* image) {
-    mVtkImages.push_back(image);
+
+//--------------------------------------------------------------------
+void vvImage::SetImage(std::vector< vtkImageData* > images) {
+    Reset();
+    for (unsigned int i = 0; i < images.size(); i++)
+        AddImage(images[i]);
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
-void vvImage::Init() {
-    for (unsigned int i = 0; i < mVtkImages.size(); i++) {
-        if (mVtkImages[i] != NULL)
-            mVtkImages[i]->Delete();
+
+//--------------------------------------------------------------------
+void vvImage::AddImage(vtkImageData* image) {
+    if (CLITK_EXPERIMENTAL)
+    {
+        mVtkImageReslice->SetInput(mVtkImages.size(), image);
+        mVtkImageReslice->Update();
+        mVtkImages.push_back( mVtkImageReslice->GetOutput( mVtkImages.size() ) );
     }
-    mVtkImages.resize(0);
+    else
+        mVtkImages.push_back(image);
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 int vvImage::GetNumberOfSpatialDimensions() {
     int dim=GetNumberOfDimensions();
     if (IsTimeSequence())
@@ -85,9 +100,9 @@ int vvImage::GetNumberOfSpatialDimensions() {
     else
         return dim;
 }
-//====================================================================
+//--------------------------------------------------------------------
 //
-//====================================================================
+//--------------------------------------------------------------------
 int vvImage::GetNumberOfDimensions() const {
     if (mVtkImages.size())
     {
@@ -102,7 +117,7 @@ int vvImage::GetNumberOfDimensions() const {
     }
     return 0;
 }
-//====================================================================
+//--------------------------------------------------------------------
 void vvImage::GetScalarRange(double* range)
 {
     assert(mVtkImages.size());
@@ -116,25 +131,25 @@ void vvImage::GetScalarRange(double* range)
     }
 }
 
-//====================================================================
+//--------------------------------------------------------------------
 std::string vvImage::GetScalarTypeAsString() {
     return mVtkImages[0]->GetScalarTypeAsString();
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 int vvImage::GetNumberOfScalarComponents() {
     return mVtkImages[0]->GetNumberOfScalarComponents();
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 int vvImage::GetScalarSize() {
     return mVtkImages[0]->GetScalarSize();
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 std::vector<double> vvImage::GetSpacing() {
     std::vector<double> spacing;
     int dim = this->GetNumberOfDimensions();
@@ -144,12 +159,16 @@ std::vector<double> vvImage::GetSpacing() {
             spacing.push_back(1);
         else
             spacing.push_back(mVtkImages[0]->GetSpacing()[i]);
+      if (i == 3)
+        spacing.push_back(mTimeSpacing);
+      else
+        spacing.push_back(mVtkImages[0]->GetSpacing()[i]);
     }
     return spacing;
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 std::vector<double> vvImage::GetOrigin() const {
     std::vector<double> origin;
     int dim = this->GetNumberOfDimensions();
@@ -159,12 +178,16 @@ std::vector<double> vvImage::GetOrigin() const {
             origin.push_back(0);
         else
             origin.push_back(mVtkImages[0]->GetOrigin()[i]);
+      if (i == 3)
+        origin.push_back(mTimeOrigin);
+      else
+        origin.push_back(mVtkImages[0]->GetOrigin()[i]);
     }
     return origin;
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 std::vector<int> vvImage::GetSize() {
     std::vector<int> size0;
     int dim = this->GetNumberOfDimensions();
@@ -177,9 +200,9 @@ std::vector<int> vvImage::GetSize() {
     }
     return size0;
 }
-//====================================================================
+//--------------------------------------------------------------------
 
-//====================================================================
+//--------------------------------------------------------------------
 unsigned long vvImage::GetActualMemorySize() {
     unsigned long size = 0;
     for (unsigned int i = 0; i < mVtkImages.size(); i++) {
@@ -187,6 +210,147 @@ unsigned long vvImage::GetActualMemorySize() {
     }
     return size;
 }
-//====================================================================
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+bool vvImage::IsTimeSequence() {
+  return mVtkImages.size()>1;
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+const std::vector<vtkImageData*>& vvImage::GetVTKImages() {
+  return mVtkImages;
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+vtkImageData* vvImage::GetFirstVTKImageData() { 
+  return mVtkImages[0]; 
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+bool vvImage::IsScalarTypeInteger() {
+  assert(mVtkImages.size()> 0);
+  int t = mVtkImages[0]->GetScalarType();
+  return IsScalarTypeInteger(t);
+}
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+bool vvImage::IsScalarTypeInteger(int t) {
+  if ((t == VTK_BIT) ||
+      (t == VTK_CHAR) ||
+      (t == VTK_UNSIGNED_CHAR) ||
+      (t == VTK_SHORT) ||
+      (t == VTK_UNSIGNED_SHORT) ||
+      (t == VTK_INT) ||
+      (t == VTK_UNSIGNED_INT) ||
+      (t == VTK_LONG) ||
+      (t == VTK_UNSIGNED_LONG))    {
+    return true;
+  }
+  else {
+    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