X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FvvImage.cxx;h=2a47a99d6463989ff9157009aa6057f87f509b0a;hb=12d316bb5efa14dd616e9b3cfcceb515a986341d;hp=685204161907a12d3077016801a31bc159d1598a;hpb=0083c3fb2c66812489631c7551709d121de51625;p=clitk.git diff --git a/common/vvImage.cxx b/common/vvImage.cxx index 6852041..2a47a99 100644 --- a/common/vvImage.cxx +++ b/common/vvImage.cxx @@ -1,183 +1,214 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + + 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 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 +#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(); - } - 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;iGetScalarRange(); + range[0]=temp[0];range[1]=temp[1]; + for (unsigned int i=1;iGetScalarRange(); - 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 vvImage::GetSpacing() { - std::vector spacing; - int dim = this->GetNumberOfDimensions(); - for (int i = 0; i < dim; i++) + std::vector 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 vvImage::GetOrigin() const { - std::vector origin; - int dim = this->GetNumberOfDimensions(); - for (int i = 0; i < dim; i++) + std::vector 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 vvImage::GetSize() { - std::vector size0; - int dim = this->GetNumberOfDimensions(); - for (int i = 0; i < dim; i++) + std::vector 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; } //-------------------------------------------------------------------- @@ -211,7 +242,6 @@ bool vvImage::IsScalarTypeInteger() { } //-------------------------------------------------------------------- - //-------------------------------------------------------------------- bool vvImage::IsScalarTypeInteger(int t) { if ((t == VTK_BIT) || @@ -229,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