1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #include "vvToolResample.h"
21 #include "vvToolCreator.h"
24 #include <QMessageBox>
26 #define COLUMN_IMAGE_NAME 7
28 ADD_TOOL(vvToolResample);
30 //------------------------------------------------------------------------------
31 vvToolResample::vvToolResample(vvMainWindowBase * parent, Qt::WindowFlags f):
32 vvToolWidgetBase(parent,f),
33 vvToolBase<vvToolResample>(parent),
34 Ui::vvToolResample() {
35 Ui_vvToolResample::setupUi(mToolWidget);
37 mFilter = clitk::ImageResampleGenericFilter::New();
40 mInputFileFormat = "";
43 mCurrentSlicerManager=NULL;
46 mInputSpacing.resize(0);
47 mInputOrigin.resize(0);
48 mOutputSize.resize(0);
49 mOutputSpacing.resize(0);
51 xSizeLineEdit->setText("");
52 ySizeLineEdit->setText("");
53 zSizeLineEdit->setText("");
54 xSpacingLineEdit->setText("");
55 ySpacingLineEdit->setText("");
56 zSpacingLineEdit->setText("");
57 scaleSizeLineEdit->setText("");
58 scaleSpacingLineEdit->setText("");
60 sizeRadioButton->setChecked(0);
61 scaleSizeRadioButton->setChecked(0);
62 isoSizeRadioButton->setChecked(0);
63 spacingRadioButton->setChecked(0);
64 scaleSpacingRadioButton->setChecked(0);
65 isoSpacingRadioButton->setChecked(0);
67 gaussianFilterCheckBox->setCheckState(Qt::Unchecked);
69 xGaussianLineEdit->hide();
70 yGaussianLineEdit->hide();
71 zGaussianLineEdit->hide();
72 gaussianFilterLabel->hide();
75 bSplineOrderSpinBox->hide();
76 bLUTFactorLabel->hide();
81 qPalette.setColor(QPalette::Foreground, QColor(Qt::blue));
82 mInputFormatLabel->setPalette(qPalette);
83 mInputDimLabel->setPalette(qPalette);
84 mInputPixelTypeLabel->setPalette(qPalette);
85 mInputSizeLabel->setPalette(qPalette);
86 mInputSpacingLabel->setPalette(qPalette);
88 // Set how many inputs are needed for this tool
89 AddInputSelector("Select an image to resample", mFilter);
91 // Connect signals & slots
93 connect(sizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
94 connect(scaleSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
95 connect(isoSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
96 connect(spacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
97 connect(scaleSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
98 connect(isoSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
100 connect(xSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
101 connect(ySizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
102 connect(zSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
103 connect(xSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
104 connect(ySpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
105 connect(zSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
106 connect(scaleSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromScale()));
107 connect(scaleSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromScale()));
108 connect(isoSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromIso()));
109 connect(isoSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromIso()));
111 connect(gaussianFilterCheckBox,SIGNAL(stateChanged(int)),this,SLOT(UpdateGaussianFilter()));
112 connect(interpolationComboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(UpdateInterpolation()));
114 //------------------------------------------------------------------------------
117 //------------------------------------------------------------------------------
118 void vvToolResample::Initialize() {
119 SetToolName("Resample Image");
120 SetToolMenuName("Resample");
121 SetToolIconFilename(":/common/icons/resample.png");
122 SetToolTip("Resample image with various interpolation methods.");
124 //------------------------------------------------------------------------------
127 //------------------------------------------------------------------------------
128 void vvToolResample::InputIsSelected(vvSlicerManager* m) {
130 mCurrentSlicerManager = m;
131 mCurrentImage = mCurrentSlicerManager->GetSlicer(0)->GetImage();
132 if (mCurrentImage.IsNull()) return;
133 mInputFileName = mCurrentSlicerManager->GetFileName().c_str();
135 // Set current information
136 mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
137 //ds ComponentType = mCurrentImageGetNumberOfScalarComponents();
138 mDimension = mCurrentImage->GetNumberOfDimensions();
140 // Copy size, spacing ...
141 mInputOrigin.resize(mDimension);
142 mInputSpacing.resize(mDimension);
143 mInputSize.resize(mDimension);
144 for (int i = 0; i < mDimension;i++) {
145 mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
146 mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
147 mInputSize[i] = mCurrentImage->GetSize()[i];
151 mInputFileFormat = itksys::SystemTools::GetFilenameLastExtension(mInputFileName.toStdString()).c_str();
154 mInputFormatLabel->setText(mInputFileFormat);
155 mInputSizeLabel->setText(GetVectorIntAsString(mInputSize));
156 mInputDimLabel->setText(QString::number(mDimension)+"D");
157 mInputSpacingLabel->setText(GetVectorDoubleAsString(mInputSpacing));
158 mInputPixelTypeLabel->setText(mPixelType);
159 mInputMemoryLabel->setText(GetSizeInBytes(mInputSize));
162 scaleSizeRadioButton->setChecked(true);
163 UpdateControlSizeAndSpacing();
164 scaleSizeLineEdit->setText("100");
165 ComputeNewSizeFromScale();
170 //------------------------------------------------------------------------------
173 //------------------------------------------------------------------------------
174 void vvToolResample::UpdateOutputInfo() {
175 mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
176 mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
177 mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
179 //------------------------------------------------------------------------------
182 //------------------------------------------------------------------------------
183 QString vvToolResample::GetSizeInBytes(std::vector<int> & size) {
185 for (unsigned int i=0; i<size.size(); i++) t *= size[i];
186 t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
187 QString result = QString::number(t);
188 result += " bytes (";
189 if (t > 1000000000) {
191 result += QString::number(t);
194 else if (t > 1000000) {
196 result += QString::number(t);
201 result += QString::number(t);
207 //------------------------------------------------------------------------------
210 //------------------------------------------------------------------------------
211 QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
213 for (unsigned int i= 0; i<vectorDouble.size(); i++) {
216 result += QString::number(vectorDouble[i]);
220 //------------------------------------------------------------------------------
223 //------------------------------------------------------------------------------
224 QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt) {
226 for (unsigned int i= 0; i<vectorInt.size(); i++) {
229 result += QString::number(vectorInt[i]);
233 //------------------------------------------------------------------------------
236 //------------------------------------------------------------------------------
237 void vvToolResample::FillSizeEdit(std::vector<int> size) {
238 xSizeLineEdit->setText(QString::number(size[0]));
239 ySizeLineEdit->setText(QString::number(size[1]));
241 zSizeLineEdit->setText(QString::number(size[2]));
243 //------------------------------------------------------------------------------
246 //------------------------------------------------------------------------------
247 void vvToolResample::FillSpacingEdit(std::vector<double> spacing) {
248 xSpacingLineEdit->setText(QString::number(spacing[0]));
249 ySpacingLineEdit->setText(QString::number(spacing[1]));
250 if (spacing.size() > 2)
251 zSpacingLineEdit->setText(QString::number(spacing[2]));
253 //------------------------------------------------------------------------------
256 //------------------------------------------------------------------------------
257 void vvToolResample::UpdateOutputSizeAndSpacing() {
258 mOutputSize.resize(mDimension);
259 mOutputSize = mInputSize;
260 mOutputSpacing.resize(mDimension);
261 mOutputSpacing = mInputSpacing;
262 mOutputSize[0] = (int)xSizeLineEdit->text().toDouble();
263 mOutputSize[1] = (int)ySizeLineEdit->text().toDouble();
265 mOutputSize[2] = (int)zSizeLineEdit->text().toDouble();
267 mOutputSpacing[0] = xSpacingLineEdit->text().toDouble();
268 mOutputSpacing[1] = ySpacingLineEdit->text().toDouble();
270 mOutputSpacing[2] = zSpacingLineEdit->text().toDouble();
274 //------------------------------------------------------------------------------
277 //------------------------------------------------------------------------------
278 void vvToolResample::UpdateControlSizeAndSpacing() {
279 scaleSizeLineEdit->setText("");
280 scaleSpacingLineEdit->setText("");
281 isoSizeLineEdit->setText("");
282 isoSpacingLineEdit->setText("");
284 xSizeLineEdit->setReadOnly(1);
285 ySizeLineEdit->setReadOnly(1);
286 zSizeLineEdit->setReadOnly(1);
287 scaleSizeLineEdit->setReadOnly(1);
288 isoSizeLineEdit->setReadOnly(1);
290 xSpacingLineEdit->setReadOnly(1);
291 ySpacingLineEdit->setReadOnly(1);
292 zSpacingLineEdit->setReadOnly(1);
293 scaleSpacingLineEdit->setReadOnly(1);
294 isoSpacingLineEdit->setReadOnly(1);
296 if (sizeRadioButton->isChecked()) {
297 xSizeLineEdit->setReadOnly(0);
298 ySizeLineEdit->setReadOnly(0);
300 zSizeLineEdit->setReadOnly(0);
303 if (spacingRadioButton->isChecked()) {
304 xSpacingLineEdit->setReadOnly(0);
305 ySpacingLineEdit->setReadOnly(0);
307 zSpacingLineEdit->setReadOnly(0);
309 else if (scaleSizeRadioButton->isChecked())
310 scaleSizeLineEdit->setReadOnly(0);
311 else if (scaleSpacingRadioButton->isChecked())
312 scaleSpacingLineEdit->setReadOnly(0);
313 else if (isoSizeRadioButton->isChecked())
314 isoSizeLineEdit->setReadOnly(0);
315 else if (isoSpacingRadioButton->isChecked())
316 isoSpacingLineEdit->setReadOnly(0);
319 //------------------------------------------------------------------------------
322 //------------------------------------------------------------------------------
323 void vvToolResample::ComputeNewSpacingFromSize() {
324 double newSpacing = mInputSpacing[0]*mInputSize[0];
325 xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
326 newSpacing = mInputSpacing[1]*mInputSize[1];
327 ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
330 newSpacing = mInputSpacing[2]*mInputSize[2];
331 zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
333 UpdateOutputSizeAndSpacing();
335 //------------------------------------------------------------------------------
338 //------------------------------------------------------------------------------
339 void vvToolResample::ComputeNewSizeFromSpacing() {
340 double newSize = mInputSpacing[0]*mInputSize[0];
341 xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
342 newSize = mInputSpacing[1]*mInputSize[1];
343 ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
346 newSize = mInputSpacing[2]*mInputSize[2];
347 zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
349 UpdateOutputSizeAndSpacing();
351 //------------------------------------------------------------------------------
354 //------------------------------------------------------------------------------
355 void vvToolResample::ComputeNewSpacingFromScale() {
356 xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
357 ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
359 zSpacingLineEdit->setText(QString::number(mInputSpacing[2]*scaleSpacingLineEdit->text().toDouble()/100));
360 ComputeNewSizeFromSpacing();
362 //------------------------------------------------------------------------------
365 //------------------------------------------------------------------------------
366 void vvToolResample::ComputeNewSizeFromScale() {
367 xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
368 ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
370 zSizeLineEdit->setText(QString::number(mInputSize[2]*scaleSizeLineEdit->text().toDouble()/100));
371 ComputeNewSpacingFromSize();
373 //------------------------------------------------------------------------------
376 //------------------------------------------------------------------------------
377 void vvToolResample::ComputeNewSpacingFromIso() {
378 xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
379 ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
381 zSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
382 ComputeNewSizeFromSpacing();
384 //------------------------------------------------------------------------------
387 //------------------------------------------------------------------------------
388 void vvToolResample::ComputeNewSizeFromIso() {
389 xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
390 ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
392 zSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
393 ComputeNewSpacingFromSize();
395 //------------------------------------------------------------------------------
398 //------------------------------------------------------------------------------
399 void vvToolResample::UpdateInterpolation() {
400 if (interpolationComboBox->currentText() == "BSpline") {
401 bSplineLabel->show();
402 bSplineOrderSpinBox->show();
403 bLUTFactorLabel->hide();
406 else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") {
407 bSplineLabel->show();
408 bSplineOrderSpinBox->show();
409 bLUTFactorLabel->show();
413 bSplineLabel->hide();
414 bSplineOrderSpinBox->hide();
415 bLUTFactorLabel->hide();
419 //------------------------------------------------------------------------------
422 //------------------------------------------------------------------------------
423 void vvToolResample::UpdateGaussianFilter() {
424 if (gaussianFilterCheckBox->isChecked()) {
425 gaussianFilterLabel->show();
426 xGaussianLineEdit->show();
427 yGaussianLineEdit->show();
429 zGaussianLineEdit->show();
432 gaussianFilterLabel->hide();
433 xGaussianLineEdit->hide();
434 yGaussianLineEdit->hide();
435 zGaussianLineEdit->hide();
438 //------------------------------------------------------------------------------
441 //------------------------------------------------------------------------------
442 void vvToolResample::apply() {
444 // Get resampler options
445 std::vector<double> sigma;
446 sigma.push_back(xGaussianLineEdit->text().toDouble());
447 sigma.push_back(yGaussianLineEdit->text().toDouble());
448 if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
449 if (mDimension == 4) sigma.push_back(0.01); //FIXME Don't filter along the temporal direction
451 mFilter->SetOutputSize(mOutputSize);
452 mFilter->SetOutputSpacing(mOutputSpacing);
453 mFilter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
455 if (interpolationComboBox->currentText() == "BSpline")
456 mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
457 else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") {
458 mFilter->SetInterpolationName("blut");
459 mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
460 mFilter->SetBLUTSampling(bLUTSpinBox->value());
462 if (gaussianFilterCheckBox->isChecked())
463 mFilter->SetGaussianSigma(sigma);
464 // mFilter->SetOutputFileName(OutputFileName.toStdString());
465 mFilter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
466 mFilter->SetInputVVImage(mCurrentImage);
470 mOutput = mFilter->GetOutputVVImage();
471 AddImage(mOutput,GetOutputFileName());
474 //------------------------------------------------------------------------------
477 //------------------------------------------------------------------------------
478 std::string vvToolResample::GetOutputFileName() {
479 QFileInfo info(QString(mCurrentSlicerManager->GetFileName().c_str()));
480 return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
482 //------------------------------------------------------------------------------