X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolResample.cxx;h=64b3768bed771352d5c70ef44ce5d5dea84c500f;hb=b8e5890d37dfd64409b9694f73c0be164a089e64;hp=531a03b879098dcd7566f68008ed2ea135b98c89;hpb=5a80d16b4dc2ad2d825c443f39ae6276786e72e4;p=clitk.git diff --git a/vv/vvToolResample.cxx b/vv/vvToolResample.cxx index 531a03b..64b3768 100644 --- a/vv/vvToolResample.cxx +++ b/vv/vvToolResample.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,27 +14,40 @@ - BSD See included LICENSE.txt file - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html - ======================================================================-====*/ + ===========================================================================**/ +// vv #include "vvToolResample.h" #include "vvSlicer.h" #include "vvToolCreator.h" +// qt #include #include +#include #define COLUMN_IMAGE_NAME 7 ADD_TOOL(vvToolResample); + +#define SetArgOptionString(OPTION, VALUE) \ + { \ + OPTION##_given = VALUE.size(); \ + OPTION##_arg = new char[VALUE.size()]; \ + strcpy(OPTION##_arg, VALUE.c_str()); \ + } + //------------------------------------------------------------------------------ vvToolResample::vvToolResample(vvMainWindowBase * parent, Qt::WindowFlags f): vvToolWidgetBase(parent,f), vvToolBase(parent), - Ui::vvToolResample() { + Ui::vvToolResample() +{ Ui_vvToolResample::setupUi(mToolWidget); - mFilter = clitk::ImageResampleGenericFilter::New(); + mFilter = clitk::ResampleImageGenericFilter::New(); + //mFilter = clitk::ImageResampleGenericFilter::New(); mLastError =""; mInputFileFormat = ""; @@ -115,7 +128,8 @@ vvToolResample::vvToolResample(vvMainWindowBase * parent, Qt::WindowFlags f): //------------------------------------------------------------------------------ -void vvToolResample::Initialize() { +void vvToolResample::Initialize() +{ SetToolName("Resample Image"); SetToolMenuName("Resample"); SetToolIconFilename(":/common/icons/resample.png"); @@ -125,7 +139,8 @@ void vvToolResample::Initialize() { //------------------------------------------------------------------------------ -void vvToolResample::InputIsSelected(vvSlicerManager* m) { +void vvToolResample::InputIsSelected(vvSlicerManager* m) +{ mCurrentSlicerManager = m; mCurrentImage = mCurrentSlicerManager->GetSlicer(0)->GetImage(); @@ -133,7 +148,7 @@ void vvToolResample::InputIsSelected(vvSlicerManager* m) { mInputFileName = mCurrentSlicerManager->GetFileName().c_str(); // Set current information - mPixelType = mCurrentImage->GetScalarTypeAsString().c_str(); + mPixelType = mCurrentImage->GetScalarTypeAsITKString().c_str(); //ds ComponentType = mCurrentImageGetNumberOfScalarComponents(); mDimension = mCurrentImage->GetNumberOfDimensions(); @@ -141,7 +156,7 @@ void vvToolResample::InputIsSelected(vvSlicerManager* m) { mInputOrigin.resize(mDimension); mInputSpacing.resize(mDimension); mInputSize.resize(mDimension); - for (int i = 0; i < mDimension;i++) { + for (int i = 0; i < mDimension; i++) { mInputOrigin[i] = mCurrentImage->GetOrigin()[i]; mInputSpacing[i] = mCurrentImage->GetSpacing()[i]; mInputSize[i] = mCurrentImage->GetSize()[i]; @@ -171,7 +186,8 @@ void vvToolResample::InputIsSelected(vvSlicerManager* m) { //------------------------------------------------------------------------------ -void vvToolResample::UpdateOutputInfo() { +void vvToolResample::UpdateOutputInfo() +{ mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize)); mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing)); mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize)); @@ -180,7 +196,8 @@ void vvToolResample::UpdateOutputInfo() { //------------------------------------------------------------------------------ -QString vvToolResample::GetSizeInBytes(std::vector & size) { +QString vvToolResample::GetSizeInBytes(std::vector & size) +{ int t = 1; for (unsigned int i=0; iGetScalarSize()*mCurrentImage->GetNumberOfScalarComponents(); @@ -190,25 +207,23 @@ QString vvToolResample::GetSizeInBytes(std::vector & size) { t /= 1000000000; result += QString::number(t); result += " GB)"; - } - else if (t > 1000000) { + } else if (t > 1000000) { t /= 1000000; result += QString::number(t); result += " MB)"; - } - else if (t > 1000) { + } else if (t > 1000) { t /= 1000; result += QString::number(t); result += " KB)"; - } - else result += ")"; + } else result += ")"; return result; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -QString vvToolResample::GetVectorDoubleAsString(std::vector vectorDouble) { +QString vvToolResample::GetVectorDoubleAsString(std::vector vectorDouble) +{ QString result; for (unsigned int i= 0; i vectorDouble //------------------------------------------------------------------------------ -QString vvToolResample::GetVectorIntAsString(std::vector vectorInt) { +QString vvToolResample::GetVectorIntAsString(std::vector vectorInt) +{ QString result; for (unsigned int i= 0; i vectorInt) { //------------------------------------------------------------------------------ -void vvToolResample::FillSizeEdit(std::vector size) { +void vvToolResample::FillSizeEdit(std::vector size) +{ xSizeLineEdit->setText(QString::number(size[0])); ySizeLineEdit->setText(QString::number(size[1])); if (size.size() > 2) @@ -244,7 +261,8 @@ void vvToolResample::FillSizeEdit(std::vector size) { //------------------------------------------------------------------------------ -void vvToolResample::FillSpacingEdit(std::vector spacing) { +void vvToolResample::FillSpacingEdit(std::vector spacing) +{ xSpacingLineEdit->setText(QString::number(spacing[0])); ySpacingLineEdit->setText(QString::number(spacing[1])); if (spacing.size() > 2) @@ -254,7 +272,8 @@ void vvToolResample::FillSpacingEdit(std::vector spacing) { //------------------------------------------------------------------------------ -void vvToolResample::UpdateOutputSizeAndSpacing() { +void vvToolResample::UpdateOutputSizeAndSpacing() +{ mOutputSize.resize(mDimension); mOutputSize = mInputSize; mOutputSpacing.resize(mDimension); @@ -275,7 +294,8 @@ void vvToolResample::UpdateOutputSizeAndSpacing() { //------------------------------------------------------------------------------ -void vvToolResample::UpdateControlSizeAndSpacing() { +void vvToolResample::UpdateControlSizeAndSpacing() +{ scaleSizeLineEdit->setText(""); scaleSpacingLineEdit->setText(""); isoSizeLineEdit->setText(""); @@ -298,15 +318,13 @@ void vvToolResample::UpdateControlSizeAndSpacing() { ySizeLineEdit->setReadOnly(0); if (mDimension > 2) zSizeLineEdit->setReadOnly(0); - } - else { + } else { if (spacingRadioButton->isChecked()) { xSpacingLineEdit->setReadOnly(0); ySpacingLineEdit->setReadOnly(0); if (mDimension > 2) zSpacingLineEdit->setReadOnly(0); - } - else if (scaleSizeRadioButton->isChecked()) + } else if (scaleSizeRadioButton->isChecked()) scaleSizeLineEdit->setReadOnly(0); else if (scaleSpacingRadioButton->isChecked()) scaleSpacingLineEdit->setReadOnly(0); @@ -320,39 +338,40 @@ void vvToolResample::UpdateControlSizeAndSpacing() { //------------------------------------------------------------------------------ -void vvToolResample::ComputeNewSpacingFromSize() { +void vvToolResample::ComputeNewSpacingFromSize() +{ double newSpacing = mInputSpacing[0]*mInputSize[0]; xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble())); newSpacing = mInputSpacing[1]*mInputSize[1]; ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble())); - if (mDimension > 2) - { - newSpacing = mInputSpacing[2]*mInputSize[2]; - zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble())); - } + if (mDimension > 2) { + newSpacing = mInputSpacing[2]*mInputSize[2]; + zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble())); + } UpdateOutputSizeAndSpacing(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolResample::ComputeNewSizeFromSpacing() { +void vvToolResample::ComputeNewSizeFromSpacing() +{ double newSize = mInputSpacing[0]*mInputSize[0]; xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble())); newSize = mInputSpacing[1]*mInputSize[1]; ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble())); - if (mDimension > 2) - { - newSize = mInputSpacing[2]*mInputSize[2]; - zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble())); - } + if (mDimension > 2) { + newSize = mInputSpacing[2]*mInputSize[2]; + zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble())); + } UpdateOutputSizeAndSpacing(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolResample::ComputeNewSpacingFromScale() { +void vvToolResample::ComputeNewSpacingFromScale() +{ xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100)); ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100)); if (mDimension > 2) @@ -363,7 +382,8 @@ void vvToolResample::ComputeNewSpacingFromScale() { //------------------------------------------------------------------------------ -void vvToolResample::ComputeNewSizeFromScale() { +void vvToolResample::ComputeNewSizeFromScale() +{ xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100)); ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100)); if (mDimension > 2) @@ -374,7 +394,8 @@ void vvToolResample::ComputeNewSizeFromScale() { //------------------------------------------------------------------------------ -void vvToolResample::ComputeNewSpacingFromIso() { +void vvToolResample::ComputeNewSpacingFromIso() +{ xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble())); ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble())); if (mDimension > 2) @@ -385,7 +406,8 @@ void vvToolResample::ComputeNewSpacingFromIso() { //------------------------------------------------------------------------------ -void vvToolResample::ComputeNewSizeFromIso() { +void vvToolResample::ComputeNewSizeFromIso() +{ xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble())); ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble())); if (mDimension > 2) @@ -396,20 +418,19 @@ void vvToolResample::ComputeNewSizeFromIso() { //------------------------------------------------------------------------------ -void vvToolResample::UpdateInterpolation() { +void vvToolResample::UpdateInterpolation() +{ if (interpolationComboBox->currentText() == "BSpline") { bSplineLabel->show(); bSplineOrderSpinBox->show(); bLUTFactorLabel->hide(); bLUTSpinBox->hide(); - } - else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") { + } else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") { bSplineLabel->show(); bSplineOrderSpinBox->show(); bLUTFactorLabel->show(); bLUTSpinBox->show(); - } - else { + } else { bSplineLabel->hide(); bSplineOrderSpinBox->hide(); bLUTFactorLabel->hide(); @@ -420,15 +441,15 @@ void vvToolResample::UpdateInterpolation() { //------------------------------------------------------------------------------ -void vvToolResample::UpdateGaussianFilter() { +void vvToolResample::UpdateGaussianFilter() +{ if (gaussianFilterCheckBox->isChecked()) { gaussianFilterLabel->show(); xGaussianLineEdit->show(); yGaussianLineEdit->show(); if (mDimension > 2) zGaussianLineEdit->show(); - } - else { + } else { gaussianFilterLabel->hide(); xGaussianLineEdit->hide(); yGaussianLineEdit->hide(); @@ -439,7 +460,8 @@ void vvToolResample::UpdateGaussianFilter() { //------------------------------------------------------------------------------ -void vvToolResample::apply() { +void vvToolResample::apply() +{ // Get resampler options std::vector sigma; @@ -448,26 +470,75 @@ void vvToolResample::apply() { if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble()); if (mDimension == 4) sigma.push_back(0.01); //FIXME Don't filter along the temporal direction - mFilter->SetOutputSize(mOutputSize); - mFilter->SetOutputSpacing(mOutputSpacing); - mFilter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString()); - - if (interpolationComboBox->currentText() == "BSpline") - mFilter->SetBSplineOrder(bSplineOrderSpinBox->value()); - else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") { - mFilter->SetInterpolationName("blut"); - mFilter->SetBSplineOrder(bSplineOrderSpinBox->value()); - mFilter->SetBLUTSampling(bLUTSpinBox->value()); + // Build ArgsInfo + clitk::ResampleImageGenericFilter::ArgsInfoType mArgsInfo; + + // Initialisation to default + cmdline_parser_clitkResampleImage_init(&mArgsInfo); + mArgsInfo.input_given = 0; + mArgsInfo.output_given = 0; + + // Size and spacing options + mArgsInfo.size_given = mDimension; + mArgsInfo.spacing_given = mDimension; + mArgsInfo.size_arg = new int[mDimension]; + mArgsInfo.spacing_arg = new float[mDimension]; + for(int i=0; iisChecked() || + scaleSizeRadioButton->isChecked() || + isoSizeRadioButton->isChecked()) { + mArgsInfo.spacing_given=0; + } + if (spacingRadioButton->isChecked() || + scaleSpacingRadioButton->isChecked() || + isoSpacingRadioButton->isChecked()) { + mArgsInfo.size_given=0; + } + + // Interpolation options + std::string interp = interpolationComboBox->currentText().toLower().toStdString(); + if (interp == "nn") SetArgOptionString(mArgsInfo.interp, std::string("nn")); + if (interp == "linear") SetArgOptionString(mArgsInfo.interp, std::string("linear")); + if (interp == "bspline") SetArgOptionString(mArgsInfo.interp, std::string("bspline")); + if (interp == "blut (faster bspline)") SetArgOptionString(mArgsInfo.interp, std::string("blut")); + if (interp == "windowed sinc") SetArgOptionString(mArgsInfo.interp, std::string("windowed sinc")); + + if (interp == "bspline") { + mArgsInfo.order_arg = bSplineOrderSpinBox->value(); } - if (gaussianFilterCheckBox->isChecked()) - mFilter->SetGaussianSigma(sigma); - // mFilter->SetOutputFileName(OutputFileName.toStdString()); - mFilter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble()); + else { + if (interp == "blut (faster bspline)") { + mArgsInfo.order_arg = bSplineOrderSpinBox->value(); + mArgsInfo.sampling_arg = bLUTSpinBox->value(); + } + } + + // Gauss + if (gaussianFilterCheckBox->isChecked()) { + mArgsInfo.gauss_given = mDimension; + mArgsInfo.gauss_arg = new float[mDimension]; + for(int i=0; itext().toDouble(); + + // Thread + mArgsInfo.thread_arg = QThread::idealThreadCount(); + mArgsInfo.thread_given = 1; + + // Set options to filter + mFilter->SetArgsInfo(mArgsInfo); mFilter->SetInputVVImage(mCurrentImage); // Go ! mFilter->Update(); mOutput = mFilter->GetOutputVVImage(); + mOutput->GetTransform()[0]->SetMatrix(mCurrentSlicerManager->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix()); AddImage(mOutput,GetOutputFileName()); close(); } @@ -475,7 +546,8 @@ void vvToolResample::apply() { //------------------------------------------------------------------------------ -std::string vvToolResample::GetOutputFileName() { +std::string vvToolResample::GetOutputFileName() +{ QFileInfo info(QString(mCurrentSlicerManager->GetFileName().c_str())); return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString()); }