X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolCropImage.cxx;h=58117561f5e0f3cb40d4637f97eea6b273cd4c95;hb=84d22eb783b17aa0a1f62d78abf3c11737df0c3b;hp=ba97489b8da372479c7c35aa9a8c755e5ab8331f;hpb=98bdb72d057c122863776f8c3fb74659e8c87beb;p=clitk.git diff --git a/vv/vvToolCropImage.cxx b/vv/vvToolCropImage.cxx index ba97489..5811756 100644 --- a/vv/vvToolCropImage.cxx +++ b/vv/vvToolCropImage.cxx @@ -1,39 +1,41 @@ /*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Program: vv - Module: $RCSfile: vvToolCropImage.cxx,v $ - Language: C++ - Date: $Date: 2010/03/01 15:38:09 $ - Version: $Revision: 1.3 $ - Author : David Sarrut (david.sarrut@creatis.insa-lyon.fr) + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr - Copyright (C) 2008 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr - CREATIS-LRMN 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. - 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. + It is distributed under dual licence - 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. + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ - You should have received a copy of the GNU General Public License - along with this program. If not, see . +// vv +#include "vvToolCropImage.h" +#include "vvSlicer.h" - =========================================================================*/ +// clitk +#include "clitkCropImage_ggo.h" +#include "clitkCropImageGenericFilter.h" +#include "clitkExceptionObject.h" -#include "vvToolCropImage.h" +// qt #include #include #include +#include + +// vtk #include #include #include #include -#include "vvSlicer.h" //------------------------------------------------------------------------------ // Create the tool and automagically (I like this word) insert it in @@ -44,44 +46,73 @@ ADD_TOOL(vvToolCropImage); //------------------------------------------------------------------------------ vvToolCropImage::vvToolCropImage(vvMainWindowBase * parent, Qt::WindowFlags f): - vvToolWidgetBase(parent, f), - vvToolBase(parent), - Ui::vvToolCropImage() { + vvToolWidgetBase(parent, f), + vvToolBase(parent), + Ui::vvToolCropImage() +{ // GUI Initialization Ui_vvToolCropImage::setupUi(mToolWidget); - + // mTLabel2->setHidden(false); + // tminSlider->setHidden(false); + // tmaxSlider->setHidden(false); + // spin_tmin->setHidden(false); + // spin_tmax->setHidden(false); + // mLabelTimeCropping->setHidden(false); + 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"); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -vvToolCropImage::~vvToolCropImage() { +vvToolCropImage::~vvToolCropImage() +{ } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -bool vvToolCropImage::close() { - for(int i=0; i<6; i++) mReducedExtent[i] = mInitialExtent[i]; +void vvToolCropImage::closeEvent(QCloseEvent *event) +{ + // Reset extends + for(int i=0; iaccept(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolCropImage::reject() { - for(int i=0; i<6; i++) mReducedExtent[i] = mInitialExtent[i]; +bool vvToolCropImage::close() +{ + return vvToolWidgetBase::close(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolCropImage::reject() +{ + for(int i=0; isetMinimum(xminSlider->value()); mReducedExtent[0] = xminSlider->value(); UpdateExtent(); @@ -90,7 +121,8 @@ void vvToolCropImage::sliderXMinValueChanged(int s) { //------------------------------------------------------------------------------ -void vvToolCropImage::sliderXMaxValueChanged(int s) { +void vvToolCropImage::sliderXMaxValueChanged(int s) +{ xminSlider->setMaximum(xmaxSlider->value()); mReducedExtent[1] = xmaxSlider->value(); UpdateExtent(); @@ -99,7 +131,8 @@ void vvToolCropImage::sliderXMaxValueChanged(int s) { //------------------------------------------------------------------------------ -void vvToolCropImage::sliderYMinValueChanged(int s) { +void vvToolCropImage::sliderYMinValueChanged(int s) +{ ymaxSlider->setMinimum(yminSlider->value()); mReducedExtent[2] = yminSlider->value(); UpdateExtent(); @@ -108,7 +141,8 @@ void vvToolCropImage::sliderYMinValueChanged(int s) { //------------------------------------------------------------------------------ -void vvToolCropImage::sliderYMaxValueChanged(int s) { +void vvToolCropImage::sliderYMaxValueChanged(int s) +{ yminSlider->setMaximum(ymaxSlider->value()); mReducedExtent[3] = ymaxSlider->value(); UpdateExtent(); @@ -117,7 +151,8 @@ void vvToolCropImage::sliderYMaxValueChanged(int s) { //------------------------------------------------------------------------------ -void vvToolCropImage::sliderZMinValueChanged(int s) { +void vvToolCropImage::sliderZMinValueChanged(int s) +{ zmaxSlider->setMinimum(zminSlider->value()); mReducedExtent[4] = zminSlider->value(); UpdateExtent(); @@ -126,7 +161,8 @@ void vvToolCropImage::sliderZMinValueChanged(int s) { //------------------------------------------------------------------------------ -void vvToolCropImage::sliderZMaxValueChanged(int s) { +void vvToolCropImage::sliderZMaxValueChanged(int s) +{ zminSlider->setMaximum(zmaxSlider->value()); mReducedExtent[5] = zmaxSlider->value(); UpdateExtent(); @@ -135,47 +171,50 @@ void vvToolCropImage::sliderZMaxValueChanged(int s) { //------------------------------------------------------------------------------ -// void vvToolCropImage::sliderTMinValueChanged(int s) { -// tmaxSlider->setMinimum(tminSlider->value()); -// mReducedExtent[6] = tminSlider->value(); -// 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::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) +{ // 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); @@ -184,19 +223,15 @@ 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; i<6; i++) mInitialExtent[i] = mReducedExtent[i]; - for(int i=0; iNumberOfSlicers(); i++) { + for(int i=0; iGetNumberOfSlicers(); i++) { mCurrentSlicerManager->GetSlicer(i)->EnableReducedExtent(true); } - - // Not now .... - // mIntensitySlider->SetImage(mCurrentImage); - //mIntensitySlider->setEnabled(false); // Set initial sliders values std::vector imsize = mCurrentSlicerManager->GetImage()->GetSize(); @@ -214,11 +249,11 @@ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) { zmaxSlider->setValue(imsize[2]-1); } - // if (slicer->GetDimension() >3) { - // tminSlider->setMaximum(imsize[3]-1); - // tmaxSlider->setMaximum(imsize[3]-1); - // tmaxSlider->setValue(imsize[3]-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); @@ -233,13 +268,13 @@ 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); - // } - + + 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))); @@ -247,54 +282,122 @@ void vvToolCropImage::InputIsSelected(vvSlicerManager * slicer) { 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(tminSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMinValueChanged(int))); + connect(tmaxSlider, SIGNAL(valueChanged(int)), this, SLOT(sliderTMaxValueChanged(int))); + + // connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateExtent())); + //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateExtent())); + // connect(mIntensitySlider, SIGNAL(valueChanged(double)), this, SLOT(autoCropValueChanged(double))); + 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)); + + // 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]; + mArgsInfo.boundingBox_arg[0] = xminSlider->value(); + mArgsInfo.boundingBox_arg[1] = xmaxSlider->value(); + mArgsInfo.boundingBox_arg[2] = yminSlider->value(); + mArgsInfo.boundingBox_arg[3] = ymaxSlider->value(); + if (n>3) { // 3D + mArgsInfo.boundingBox_arg[4] = zminSlider->value(); + mArgsInfo.boundingBox_arg[5] = zmaxSlider->value(); + } + + if (n>6) { // 4D + // mArgsInfo.boundingBox_arg[6] = tminSlider->value(); + // mArgsInfo.boundingBox_arg[7] = tmaxSlider->value(); + 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; iSetInputVVImage(mCurrentImage); + filter->SetArgsInfo(mArgsInfo); + + // Go ! (not threaded) + try{ + filter->Update(); + } + catch(clitk::ExceptionObject & e) { + DD(e.what()); + QApplication::restoreOverrideCursor(); + close(); + } + + // Retrieve result and display it + vvImage::Pointer output = filter->GetOutputVVImage(); + std::ostringstream osstream; + osstream << "Cropped_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; + AddImage(output,osstream.str()); + + // End + QApplication::restoreOverrideCursor(); + close(); + + /** + // OLD approach with VTK 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); - } + 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); + } QApplication::restoreOverrideCursor(); std::ostringstream osstream; osstream << "Crop_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; - AddImage(mResult, osstream.str()); + AddImage(mResult, osstream.str()); close(); + + **/ } //------------------------------------------------------------------------------