X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolCropImage.cxx;h=0fb3e5483287485931862aefe3c188db5179f28d;hb=HEAD;hp=74c1e4c43c53207ca6a281c0f594f3fa0a97203b;hpb=163fa80ef3873595f3e3cf75fb03e53536d1a6ee;p=clitk.git diff --git a/vv/vvToolCropImage.cxx b/vv/vvToolCropImage.cxx index 74c1e4c..0fb3e54 100644 --- a/vv/vvToolCropImage.cxx +++ b/vv/vvToolCropImage.cxx @@ -1,9 +1,9 @@ /*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Authors belong to: + Authors belong to: - University of LYON http://www.universite-lyon.fr/ - - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - Léon Bérard cancer center http://www.centreleonberard.fr - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr This software is distributed WITHOUT ANY WARRANTY; without even @@ -14,16 +14,32 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html -======================================================================-====*/ +===========================================================================**/ + +// vv #include "vvToolCropImage.h" +#include "vvSlicer.h" + +// clitk +#include "clitkCropImage_ggo.h" +#include "clitkCropImageGenericFilter.h" +#include "clitkExceptionObject.h" + +// qt #include #include #include +#include +#include + +// vtk +#include +#include +#include #include #include #include #include -#include "vvSlicer.h" //------------------------------------------------------------------------------ // Create the tool and automagically (I like this word) insert it in @@ -31,143 +47,151 @@ ADD_TOOL(vvToolCropImage); //------------------------------------------------------------------------------ - +//same order of int* returned by VtkImageData::WholeExtent +enum sliderId {xmin, xmax, ymin, ymax, zmin, zmax, tmin, tmax}; //------------------------------------------------------------------------------ vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f): - vvToolWidgetBase(parent, f), - vvToolBase(parent), - Ui::vvToolCropImage() { + vvToolWidgetBase(parent, f), + vvToolBase(parent), + Ui::vvToolCropImage(),mSliders(8) +{ // GUI Initialization Ui_vvToolCropImage::setupUi(mToolWidget); + mTLabel1->setHidden(true); + mTLabel2->setHidden(true); + tminSlider->setHidden(true); + tmaxSlider->setHidden(true); + spin_tmin->setHidden(true); + spin_tmax->setHidden(true); + mLabelTimeCropping->setHidden(true); // Set how many inputs are needed for this tool AddInputSelector("Select one image"); + + mSliders[xmin]=xminSlider; + mSliders[xmax]=xmaxSlider; + mSliders[ymin]=yminSlider; + mSliders[ymax]=ymaxSlider; + mSliders[zmin]=zminSlider; + mSliders[zmax]=zmaxSlider; + mSliders[tmin]=tminSlider; + mSliders[tmax]=tmaxSlider; + + // Record initial extend + mReducedExtent = new int[6]; + mInitialExtent = new int[6]; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -vvToolCropImage::~vvToolCropImage() { - -} -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -bool vvToolCropImage::close() { - for(int i=0; isetMinimum(xminSlider->value()); - mReducedExtent[0] = xminSlider->value(); - UpdateExtent(); -} -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -void vvToolCropImage::sliderXMaxValueChanged(int s) { - xminSlider->setMaximum(xmaxSlider->value()); - mReducedExtent[1] = xmaxSlider->value(); - UpdateExtent(); +vvToolCropImage::~vvToolCropImage() +{ + delete [] mReducedExtent; + delete [] mInitialExtent; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::sliderYMinValueChanged(int s) { - ymaxSlider->setMinimum(yminSlider->value()); - mReducedExtent[2] = yminSlider->value(); - UpdateExtent(); +void vvToolCropImage::closeEvent(QCloseEvent *event) +{ + if(mCurrentSlicerManager){ +// Reset extends + for(int i=0; i<6; i++){ + mReducedExtent[i] = mInitialExtent[i]; + } + for(int i=0; iGetNumberOfSlicers(); i++) + mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false); + UpdateExtent(); + + mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(mConcatenedTransform); + for (int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->ResetCamera(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) ); + } + } + vvToolWidgetBase::closeEvent(event); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::sliderYMaxValueChanged(int s) { - yminSlider->setMaximum(ymaxSlider->value()); - mReducedExtent[3] = ymaxSlider->value(); - UpdateExtent(); +bool vvToolCropImage::close() +{ + return vvToolWidgetBase::close(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::sliderZMinValueChanged(int s) { - zmaxSlider->setMinimum(zminSlider->value()); - mReducedExtent[4] = zminSlider->value(); +void vvToolCropImage::reject() +{ + for(int i=0; iGetNumberOfSlicers(); i++) + mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(false); UpdateExtent(); + return vvToolWidgetBase::reject(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::sliderZMaxValueChanged(int s) { - zminSlider->setMaximum(zmaxSlider->value()); - mReducedExtent[5] = zmaxSlider->value(); +void vvToolCropImage::sliderValueChanged(int dim) +{ + int dimMin = dim; + if(dim%2==0){//case we are minimum + mSliders[dim+1]->setMinimum(mSliders[dim]->value()); + }else { + mSliders[--dimMin]->setMaximum(mSliders[dim]->value()); + } + mReducedExtent[dim] = mSliders[dim]->value() + mInitialExtent[dimMin]; UpdateExtent(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// void vvToolCropImage::sliderTMinValueChanged(int s) { -// tmaxSlider->setMinimum(tminSlider->value()); -// mReducedExtent[6] = tminSlider->value(); -// UpdateExtent(); -// } -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -// void vvToolCropImage::sliderTMaxValueChanged(int s) { -// tminSlider->setMaximum(tmaxSlider->value()); -// mReducedExtent[7] = tmaxSlider->value(); -// UpdateExtent(); -// } -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -void vvToolCropImage::UpdateExtent() { - for(int i=0; iNumberOfSlicers(); i++) { +void vvToolCropImage::UpdateExtent() +{ + for(int i=0; iGetNumberOfSlicers(); i++) { mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mReducedExtent); - mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); - mCurrentSlicerManager->GetSlicer(i)->Render(); + mCurrentSlicerManager->GetSlicer(i)->ForceUpdateDisplayExtent(); + mCurrentSlicerManager->GetSlicer(i)->Render(); } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) { +void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) +{ + //Save the current transformation + mConcatenedTransform = vtkSmartPointer::New(); + mConcatenedTransform->DeepCopy(slicer->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix()); + vtkSmartPointer matrix = vtkSmartPointer::New(); + matrix->Identity(); + mCurrentSlicerManager->GetImage()->GetTransform()[0]->SetMatrix(matrix); + for (int i=0; iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->ResetCamera(); + mCurrentSlicerManager->GetSlicer(i)->Render(); + mCurrentSlicerManager->UpdateLinkedNavigation( mCurrentSlicerManager->GetSlicer(i) ); + } // Change interface according to number of dimension mExtentSize = 2*slicer->GetDimension(); - // if (slicer->GetDimension()<4) { - // mTLabel1->setHidden(true); - // mTLabel2->setHidden(true); - // tminSlider->setHidden(true); - // tmaxSlider->setHidden(true); - // spin_tmin->setHidden(true); - // spin_tmax->setHidden(true); - // } + if (slicer->GetDimension()<4) { + mTLabel1->setHidden(true); + mTLabel2->setHidden(true); + tminSlider->setHidden(true); + tmaxSlider->setHidden(true); + spin_tmin->setHidden(true); + spin_tmax->setHidden(true); + mLabelTimeCropping->setHidden(true); + } if (slicer->GetDimension()<3) { mZLabel1->setHidden(true); mZLabel2->setHidden(true); @@ -176,45 +200,29 @@ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) { spin_zmin->setHidden(true); spin_zmax->setHidden(true); } - - // Record initial extend - mReducedExtent = new int[mExtentSize]; - mInitialExtent = new int[mExtentSize]; - mReducedExtent = mCurrentSlicerManager->GetImage()->GetFirstVTKImageData()->GetWholeExtent(); - for(int i=0; iNumberOfSlicers(); i++) { - //DD(i); - //DD(mReducedExtent[i]); - //DD(mInitialExtent[i]); +#if VTK_MAJOR_VERSION <= 5 + int *a = mCurrentImage->GetFirstVTKImageData()->GetWholeExtent(); +#else + int *a = mCurrentImage->GetFirstVTKImageData()->GetInformation()->Get(vtkDataObject::DATA_EXTENT()); +#endif + for(int i=0; i<6; i++){ + mInitialExtent[i] = a[i]; + mReducedExtent[i] = a[i]; + } + for(int i=0; iGetNumberOfSlicers(); i++) { mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true); + mCurrentSlicerManager->GetSlicer(i)->SetReducedExtent(mInitialExtent); } - - // Not now .... - // mIntensitySlider->SetImage(mCurrentImage); - //mIntensitySlider->setEnabled(false); - - // Set initial sliders values - std::vector imsize = mCurrentSlicerManager->GetImage()->GetSize(); - xminSlider->setMaximum(imsize[0]-1); - xmaxSlider->setMaximum(imsize[0]-1); - xmaxSlider->setValue(imsize[0]-1); - - yminSlider->setMaximum(imsize[1]-1); - ymaxSlider->setMaximum(imsize[1]-1); - ymaxSlider->setValue(imsize[1]-1); - if (slicer->GetDimension() >2) { - zminSlider->setMaximum(imsize[2]-1); - zmaxSlider->setMaximum(imsize[2]-1); - zmaxSlider->setValue(imsize[2]-1); +// Set initial sliders values + int w_ext[6], imsize[4]; + mCurrentSlicerManager->GetSlicer(0)->GetRegisterExtent(w_ext); + for(int dim=0; dimGetDimension() && dim<3; ++dim){ + imsize[dim] = w_ext[2*dim+1] - w_ext[2*dim] +1; + mSliders[dim*2]->setMaximum(imsize[dim]-1); + mSliders[dim*2+1]->setMaximum(imsize[dim]-1); + mSliders[dim*2+1]->setValue(imsize[dim]-1); } - - // if (slicer->GetDimension() >3) { - // tminSlider->setMaximum(imsize[3]-1); - // tmaxSlider->setMaximum(imsize[3]-1); - // tmaxSlider->setValue(imsize[3]-1); - // } - spin_xmin->setMaximum(imsize[0]-1); spin_xmax->setMaximum(imsize[0]-1); spin_xmax->setValue(imsize[0]-1); @@ -228,68 +236,91 @@ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) { spin_zmax->setMaximum(imsize[2]-1); spin_zmax->setValue(imsize[2]-1); } - - // if (slicer->GetDimension() >3) { - // spin_tmin->setMaximum(imsize[3]-1); - // spin_tmax->setMaximum(imsize[3]-1); - // spin_tmax->setValue(imsize[3]-1); - // } - - // Connect - connect(xminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderXMinValueChanged(int))); - connect(xmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderXMaxValueChanged(int))); - connect(yminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderYMinValueChanged(int))); - connect(ymaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderYMaxValueChanged(int))); - connect(zminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderZMinValueChanged(int))); - connect(zmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderZMaxValueChanged(int))); - // connect(tminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMinValueChanged(int))); - // connect(tmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMaxValueChanged(int))); - - // connect(mIntensitySlider, SIGNAL(valueChanged(double)), this, SLOT(autoCropValueChanged(double))); + + if (slicer->GetDimension() >3) { + spin_tmin->setMaximum(imsize[3]-1); + spin_tmax->setMaximum(imsize[3]-1); + spin_tmax->setValue(imsize[3]-1); + } + + QSignalMapper* signalMapper = new QSignalMapper(this); + connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(sliderValueChanged(int))); + for(unsigned int i=0; isetMapping(mSliders[i], i); + connect(mSliders[i], SIGNAL(valueChanged(int)), signalMapper, SLOT(map())); + } UpdateExtent(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::autoCropValueChanged(double v) { - // DD(v); - // vvImageToITKImageVector -> TODO a generic method - // then sliceriterator on each dimension from in to max - // ==> make a clitkGenericFilter even for the regular apply ... +void vvToolCropImage::autoCropValueChanged(double v) +{ + //TODO } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::apply() { - +void vvToolCropImage::apply() +{ + if (!mCurrentSlicerManager) close(); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - vvImage::Pointer mResult=vvImage::New(); - vvImage::Pointer image= mCurrentSlicerManager->GetImage(); - for (std::vector::const_iterator i=image->GetVTKImages().begin(); - i!=image->GetVTKImages().end();i++) - { - vtkSmartPointer filter=vtkSmartPointer::New(); - ///Vtk is very weird, you need to "translate the extent" to get the correct origin - //http://markmail.org/message/vndc2tr6kcabiakp#query:vtkImageClip%20origin+page:1+mid:6na7y57floutklvz+state:results - vtkSmartPointer translate=vtkSmartPointer::New(); - filter->SetInput(*i); - filter->SetOutputWholeExtent(xminSlider->value(),xmaxSlider->value(), - yminSlider->value(),ymaxSlider->value(), - zminSlider->value(),zmaxSlider->value()); - translate->SetTranslation(-xminSlider->value(),-yminSlider->value(),-zminSlider->value()); - translate->SetInput(filter->GetOutput()); - filter->ClipDataOn(); //Really create a cropped copy of the image - translate->Update(); - vtkImageData* output=vtkImageData::New(); - output->ShallowCopy(translate->GetOutput()); - mResult->AddImage(output); - } + + // Typedef + typedef args_info_clitkCropImage ArgsInfoType; + typedef clitk::CropImageGenericFilter CropFilterType; + + // Get options + ArgsInfoType mArgsInfo; + cmdline_parser_clitkCropImage_init(&mArgsInfo); // Initialisation to default + int n = mCurrentSlicerManager->GetDimension()*2; // 2D and 3D only + mArgsInfo.boundingBox_given = n; + mArgsInfo.boundingBox_arg = new int[n]; + + for(int dim=0; dimGetDimension() && dim<3; ++dim){ + mArgsInfo.boundingBox_arg[dim*2] = mSliders[dim*2]->value(); + mArgsInfo.boundingBox_arg[dim*2+1] = mSliders[dim*2+1]->value(); + } + if (n>6) { // 4D + mArgsInfo.boundingBox_arg[6] = 0; + mArgsInfo.boundingBox_arg[7] = mCurrentImage->GetSize()[3]-1; + } + // We MUST reset initial extend to input image before using the + // filter to retrieve the correct image size + for(int i=0; i<6; i++) { + mReducedExtent[i] = mInitialExtent[i]; + } + + UpdateExtent(); + // Main filter + CropFilterType::Pointer filter = CropFilterType::New(); + filter->SetInputVVImage(mCurrentImage); + filter->SetArgsInfo(mArgsInfo); + + // Go ! (not threaded) + try{ + filter->Update(); + } + catch(clitk::ExceptionObject & e) { + DD(e.what()); + QApplication::restoreOverrideCursor(); + delete [] mArgsInfo.boundingBox_arg; + close(); + } + std::ostringstream croppedImageName; + croppedImageName << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; + // Retrieve result and display it + vvImage::Pointer output = filter->GetOutputVVImage(); + + output->GetTransform()[0]->SetMatrix(mConcatenedTransform); + + AddImage(output,croppedImageName.str()); + + // End QApplication::restoreOverrideCursor(); - std::ostringstream osstream; - osstream << "Crop_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; - AddImage(mResult, osstream.str()); + delete [] mArgsInfo.boundingBox_arg; close(); } //------------------------------------------------------------------------------