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 #ifndef _VVRESAMPLERDIALOG_CXX
20 #define _VVRESAMPLERDIALOG_CXX
22 #include "vvResamplerDialog.h"
23 #include "clitkImageResampleGenericFilter.h"
27 #include <QMessageBox>
29 #define COLUMN_IMAGE_NAME 7
31 //====================================================================
32 vvResamplerDialog::vvResamplerDialog(QWidget * parent, Qt::WindowFlags f)
33 :QDialog(parent,f), Ui::vvResamplerDialog() {
39 // Connect signals & slots
40 connect(this, SIGNAL(accepted()), this, SLOT(Resample()));
41 connect(mImagesComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(UpdateCurrentInputImage()));
43 connect(sizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
44 connect(scaleSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
45 connect(isoSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
46 connect(spacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
47 connect(scaleSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
48 connect(isoSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
50 connect(xSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
51 connect(ySizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
52 connect(zSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
53 connect(xSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
54 connect(ySpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
55 connect(zSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
56 connect(scaleSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromScale()));
57 connect(scaleSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromScale()));
58 connect(isoSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromIso()));
59 connect(isoSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromIso()));
61 connect(gaussianFilterCheckBox,SIGNAL(stateChanged(int)),this,SLOT(UpdateGaussianFilter()));
62 connect(interpolationComboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(UpdateInterpolation()));
64 //====================================================================
66 //====================================================================
67 void vvResamplerDialog::Init() {
70 mInputFileFormat = "";
75 mInputSpacing.resize(0);
76 mInputOrigin.resize(0);
77 mOutputSize.resize(0);
78 mOutputSpacing.resize(0);
80 xSizeLineEdit->setText("");
81 ySizeLineEdit->setText("");
82 zSizeLineEdit->setText("");
83 xSpacingLineEdit->setText("");
84 ySpacingLineEdit->setText("");
85 zSpacingLineEdit->setText("");
86 scaleSizeLineEdit->setText("");
87 scaleSpacingLineEdit->setText("");
89 sizeRadioButton->setChecked(0);
90 scaleSizeRadioButton->setChecked(0);
91 isoSizeRadioButton->setChecked(0);
92 spacingRadioButton->setChecked(0);
93 scaleSpacingRadioButton->setChecked(0);
94 isoSpacingRadioButton->setChecked(0);
96 gaussianFilterCheckBox->setCheckState(Qt::Unchecked);
98 xGaussianLineEdit->hide();
99 yGaussianLineEdit->hide();
100 zGaussianLineEdit->hide();
101 gaussianFilterLabel->hide();
103 bSplineLabel->hide();
104 bSplineOrderSpinBox->hide();
105 bLUTFactorLabel->hide();
110 qPalette.setColor(QPalette::Foreground, QColor(Qt::blue));
111 mInputFormatLabel->setPalette(qPalette);
112 mInputDimLabel->setPalette(qPalette);
113 mInputPixelTypeLabel->setPalette(qPalette);
114 mInputSizeLabel->setPalette(qPalette);
115 mInputSpacingLabel->setPalette(qPalette);
117 UpdateCurrentInputImage();
119 //====================================================================
121 //====================================================================
122 void vvResamplerDialog::UpdateCurrentInputImage() {
123 // Set current image & index
124 mCurrentIndex = mImagesComboBox->currentIndex();
125 if (mCurrentIndex == -1) {
126 mCurrentImage = NULL;
129 mCurrentImage = mSlicerManagers[mCurrentIndex]->GetSlicer(0)->GetImage();
130 if (mCurrentImage.IsNull()) return;
131 mInputFileName = mSlicerManagers[mCurrentIndex]->GetFileName().c_str();
133 // Set current information
134 mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
135 //ds ComponentType = mCurrentImageGetNumberOfScalarComponents();
136 mDimension = mCurrentImage->GetNumberOfDimensions();
138 // Copy size, spacing ...
139 mInputOrigin.resize(mDimension);
140 mInputSpacing.resize(mDimension);
141 mInputSize.resize(mDimension);
142 for (int i = 0; i < mDimension;i++) {
143 mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
144 mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
145 mInputSize[i] = mCurrentImage->GetSize()[i];
149 mInputFileFormat = itksys::SystemTools::GetFilenameLastExtension(mInputFileName.toStdString()).c_str();
152 mInputFormatLabel->setText(mInputFileFormat);
153 mInputSizeLabel->setText(GetVectorIntAsString(mInputSize));
154 mInputDimLabel->setText(QString::number(mDimension)+"D");
155 mInputSpacingLabel->setText(GetVectorDoubleAsString(mInputSpacing));
156 mInputPixelTypeLabel->setText(mPixelType);
157 mInputMemoryLabel->setText(GetSizeInBytes(mInputSize));
160 scaleSizeRadioButton->setChecked(true);
161 UpdateControlSizeAndSpacing();
162 scaleSizeLineEdit->setText("100");
163 ComputeNewSizeFromScale();
168 //====================================================================
170 //====================================================================
171 void vvResamplerDialog::UpdateOutputInfo() {
172 mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
173 mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
174 mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
176 //====================================================================
178 //====================================================================
179 QString vvResamplerDialog::GetSizeInBytes(std::vector<int> & size) {
181 for (unsigned int i=0; i<size.size(); i++) t *= size[i];
182 t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
183 QString result = QString::number(t);
184 result += " bytes (";
185 if (t > 1000000000) {
187 result += QString::number(t);
190 else if (t > 1000000) {
192 result += QString::number(t);
197 result += QString::number(t);
202 //====================================================================
204 //====================================================================
205 QString vvResamplerDialog::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
207 for (unsigned int i= 0; i<vectorDouble.size(); i++) {
210 result += QString::number(vectorDouble[i]);
214 //====================================================================
216 //====================================================================
217 QString vvResamplerDialog::GetVectorIntAsString(std::vector<int> vectorInt) {
219 for (unsigned int i= 0; i<vectorInt.size(); i++) {
222 result += QString::number(vectorInt[i]);
226 //====================================================================
228 //====================================================================
229 void vvResamplerDialog::FillSizeEdit(std::vector<int> size) {
230 xSizeLineEdit->setText(QString::number(size[0]));
231 ySizeLineEdit->setText(QString::number(size[1]));
233 zSizeLineEdit->setText(QString::number(size[2]));
235 //====================================================================
237 //====================================================================
238 void vvResamplerDialog::FillSpacingEdit(std::vector<double> spacing) {
239 xSpacingLineEdit->setText(QString::number(spacing[0]));
240 ySpacingLineEdit->setText(QString::number(spacing[1]));
241 if (spacing.size() > 2)
242 zSpacingLineEdit->setText(QString::number(spacing[2]));
244 //====================================================================
246 //====================================================================
247 void vvResamplerDialog::UpdateOutputSizeAndSpacing() {
248 mOutputSize.resize(mDimension);
249 mOutputSize = mInputSize;
250 mOutputSpacing.resize(mDimension);
251 mOutputSpacing = mInputSpacing;
252 mOutputSize[0] = (int)xSizeLineEdit->text().toDouble();
253 mOutputSize[1] = (int)ySizeLineEdit->text().toDouble();
255 mOutputSize[2] = (int)zSizeLineEdit->text().toDouble();
257 mOutputSpacing[0] = xSpacingLineEdit->text().toDouble();
258 mOutputSpacing[1] = ySpacingLineEdit->text().toDouble();
260 mOutputSpacing[2] = zSpacingLineEdit->text().toDouble();
264 //====================================================================
266 //====================================================================
267 void vvResamplerDialog::UpdateControlSizeAndSpacing() {
268 scaleSizeLineEdit->setText("");
269 scaleSpacingLineEdit->setText("");
270 isoSizeLineEdit->setText("");
271 isoSpacingLineEdit->setText("");
273 xSizeLineEdit->setReadOnly(1);
274 ySizeLineEdit->setReadOnly(1);
275 zSizeLineEdit->setReadOnly(1);
276 scaleSizeLineEdit->setReadOnly(1);
277 isoSizeLineEdit->setReadOnly(1);
279 xSpacingLineEdit->setReadOnly(1);
280 ySpacingLineEdit->setReadOnly(1);
281 zSpacingLineEdit->setReadOnly(1);
282 scaleSpacingLineEdit->setReadOnly(1);
283 isoSpacingLineEdit->setReadOnly(1);
285 if (sizeRadioButton->isChecked()) {
286 xSizeLineEdit->setReadOnly(0);
287 ySizeLineEdit->setReadOnly(0);
289 zSizeLineEdit->setReadOnly(0);
292 if (spacingRadioButton->isChecked()) {
293 xSpacingLineEdit->setReadOnly(0);
294 ySpacingLineEdit->setReadOnly(0);
296 zSpacingLineEdit->setReadOnly(0);
298 else if (scaleSizeRadioButton->isChecked())
299 scaleSizeLineEdit->setReadOnly(0);
300 else if (scaleSpacingRadioButton->isChecked())
301 scaleSpacingLineEdit->setReadOnly(0);
302 else if (isoSizeRadioButton->isChecked())
303 isoSizeLineEdit->setReadOnly(0);
304 else if (isoSpacingRadioButton->isChecked())
305 isoSpacingLineEdit->setReadOnly(0);
308 //====================================================================
310 //====================================================================
311 void vvResamplerDialog::ComputeNewSpacingFromSize() {
312 double newSpacing = mInputSpacing[0]*mInputSize[0];
313 xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
314 newSpacing = mInputSpacing[1]*mInputSize[1];
315 ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
318 newSpacing = mInputSpacing[2]*mInputSize[2];
319 zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
321 UpdateOutputSizeAndSpacing();
323 //====================================================================
325 //====================================================================
326 void vvResamplerDialog::ComputeNewSizeFromSpacing() {
327 double newSize = mInputSpacing[0]*mInputSize[0];
328 xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
329 newSize = mInputSpacing[1]*mInputSize[1];
330 ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
333 newSize = mInputSpacing[2]*mInputSize[2];
334 zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
336 UpdateOutputSizeAndSpacing();
338 //====================================================================
340 //====================================================================
341 void vvResamplerDialog::ComputeNewSpacingFromScale() {
342 xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
343 ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
345 zSpacingLineEdit->setText(QString::number(mInputSpacing[2]*scaleSpacingLineEdit->text().toDouble()/100));
346 ComputeNewSizeFromSpacing();
348 //====================================================================
350 //====================================================================
351 void vvResamplerDialog::ComputeNewSizeFromScale() {
352 xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
353 ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
355 zSizeLineEdit->setText(QString::number(mInputSize[2]*scaleSizeLineEdit->text().toDouble()/100));
356 ComputeNewSpacingFromSize();
358 //====================================================================
360 //====================================================================
361 void vvResamplerDialog::ComputeNewSpacingFromIso() {
362 xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
363 ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
365 zSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
366 ComputeNewSizeFromSpacing();
368 //====================================================================
370 //====================================================================
371 void vvResamplerDialog::ComputeNewSizeFromIso() {
372 xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
373 ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
375 zSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
376 ComputeNewSpacingFromSize();
378 //====================================================================
380 //====================================================================
381 void vvResamplerDialog::UpdateInterpolation() {
382 if (interpolationComboBox->currentText() == "BSpline") {
383 bSplineLabel->show();
384 bSplineOrderSpinBox->show();
385 bLUTFactorLabel->hide();
388 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
389 bSplineLabel->show();
390 bSplineOrderSpinBox->show();
391 bLUTFactorLabel->show();
395 bSplineLabel->hide();
396 bSplineOrderSpinBox->hide();
397 bLUTFactorLabel->hide();
401 //====================================================================
403 //====================================================================
404 void vvResamplerDialog::UpdateGaussianFilter() {
405 if (gaussianFilterCheckBox->isChecked()) {
406 gaussianFilterLabel->show();
407 xGaussianLineEdit->show();
408 yGaussianLineEdit->show();
410 zGaussianLineEdit->show();
413 gaussianFilterLabel->hide();
414 xGaussianLineEdit->hide();
415 yGaussianLineEdit->hide();
416 zGaussianLineEdit->hide();
419 //====================================================================
421 //====================================================================
422 void vvResamplerDialog::SetSlicerManagers(std::vector<vvSlicerManager*> & m,int current_image_index) {
424 for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
425 mImagesComboBox->addItem(mSlicerManagers[i]->GetFileName().c_str());
427 mImagesComboBox->setCurrentIndex(current_image_index);
429 //====================================================================
431 //====================================================================
432 void vvResamplerDialog::Resample() {
434 // Get resampler options
435 std::vector<double> sigma;
436 sigma.push_back(xGaussianLineEdit->text().toDouble());
437 sigma.push_back(yGaussianLineEdit->text().toDouble());
438 if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
441 // Create resampler filter
442 clitk::ImageResampleGenericFilter::Pointer filter = clitk::ImageResampleGenericFilter::New();
443 filter->SetOutputSize(mOutputSize);
444 filter->SetOutputSpacing(mOutputSpacing);
445 filter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
447 if (interpolationComboBox->currentText() == "BSpline")
448 filter->SetBSplineOrder(bSplineOrderSpinBox->value());
449 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
450 filter->SetInterpolationName("blut");
451 filter->SetBSplineOrder(bSplineOrderSpinBox->value());
452 filter->SetBLUTSampling(bLUTSpinBox->value());
454 if (gaussianFilterCheckBox->isChecked())
455 filter->SetGaussianSigma(sigma);
456 // filter->SetOutputFileName(OutputFileName.toStdString());
457 filter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
458 filter->SetInputVVImage(mCurrentImage);
462 mOutput = filter->GetOutputVVImage();
464 //====================================================================
465 std::string vvResamplerDialog::GetOutputFileName()
467 QFileInfo info(mImagesComboBox->currentText());
468 return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
471 #endif /* end #define _vvResamplerDialog_CXX */