X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FvvImage.cxx;h=2a47a99d6463989ff9157009aa6057f87f509b0a;hb=12d316bb5efa14dd616e9b3cfcceb515a986341d;hp=7d68a1438e70e4656a430d153ec0145b247225d2;hpb=758de1c14c7f16d924e1a2a575d52cd3e48ec503;p=clitk.git diff --git a/common/vvImage.cxx b/common/vvImage.cxx index 7d68a14..2a47a99 100644 --- a/common/vvImage.cxx +++ b/common/vvImage.cxx @@ -1,80 +1,98 @@ -#ifndef VVIMAGE_CXX -#define VVIMAGE_CXX - /*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv -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. + 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 . - -=========================================================================*/ + 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 +#include +#include #include -//==================================================================== +//-------------------------------------------------------------------- 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::New(); + transform = vtkSmartPointer::New(); + mVtkImageReslice->SetInterpolationModeToLinear(); + mVtkImageReslice->AutoCropOutputOn(); + mVtkImageReslice->SetBackgroundColor(-1000,-1000,-1000,1); + mVtkImageReslice->SetResliceTransform(transform); } } -//==================================================================== +//-------------------------------------------------------------------- -//==================================================================== -void vvImage::SetImage(std::vector 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()) @@ -82,9 +100,9 @@ int vvImage::GetNumberOfSpatialDimensions() { else return dim; } -//==================================================================== +//-------------------------------------------------------------------- // -//==================================================================== +//-------------------------------------------------------------------- int vvImage::GetNumberOfDimensions() const { if (mVtkImages.size()) { @@ -99,7 +117,7 @@ int vvImage::GetNumberOfDimensions() const { } return 0; } -//==================================================================== +//-------------------------------------------------------------------- void vvImage::GetScalarRange(double* range) { assert(mVtkImages.size()); @@ -113,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 vvImage::GetSpacing() { std::vector spacing; int dim = this->GetNumberOfDimensions(); @@ -141,12 +159,16 @@ std::vector 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 vvImage::GetOrigin() const { std::vector origin; int dim = this->GetNumberOfDimensions(); @@ -156,12 +178,16 @@ std::vector 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 vvImage::GetSize() { std::vector size0; int dim = this->GetNumberOfDimensions(); @@ -174,9 +200,9 @@ std::vector vvImage::GetSize() { } return size0; } -//==================================================================== +//-------------------------------------------------------------------- -//==================================================================== +//-------------------------------------------------------------------- unsigned long vvImage::GetActualMemorySize() { unsigned long size = 0; for (unsigned int i = 0; i < mVtkImages.size(); i++) { @@ -184,6 +210,147 @@ unsigned long vvImage::GetActualMemorySize() { } return size; } -//==================================================================== +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +bool vvImage::IsTimeSequence() { + return mVtkImages.size()>1; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +const std::vector& 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