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 ======================================================================-====*/
18 #ifndef _vvResamplerDialog_CXX
19 #define _vvResamplerDialog_CXX
20 #include "vvResamplerDialog.h"
21 #include "clitkImageResampleGenericFilter.h"
25 #include <QMessageBox>
27 #define COLUMN_IMAGE_NAME 7
29 //====================================================================
30 vvResamplerDialog::vvResamplerDialog(QWidget * parent, Qt::WindowFlags f)
31 :QDialog(parent,f), Ui::vvResamplerDialog() {
37 // Connect signals & slots
38 connect(this, SIGNAL(accepted()), this, SLOT(Resample()));
39 connect(mImagesComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(UpdateCurrentInputImage()));
41 connect(sizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
42 connect(scaleSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
43 connect(isoSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
44 connect(spacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
45 connect(scaleSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
46 connect(isoSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
48 connect(xSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
49 connect(ySizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
50 connect(zSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
51 connect(xSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
52 connect(ySpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
53 connect(zSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
54 connect(scaleSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromScale()));
55 connect(scaleSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromScale()));
56 connect(isoSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromIso()));
57 connect(isoSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromIso()));
59 connect(gaussianFilterCheckBox,SIGNAL(stateChanged(int)),this,SLOT(UpdateGaussianFilter()));
60 connect(interpolationComboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(UpdateInterpolation()));
62 //====================================================================
64 //====================================================================
65 void vvResamplerDialog::Init() {
68 mInputFileFormat = "";
73 mInputSpacing.resize(0);
74 mInputOrigin.resize(0);
75 mOutputSize.resize(0);
76 mOutputSpacing.resize(0);
78 xSizeLineEdit->setText("");
79 ySizeLineEdit->setText("");
80 zSizeLineEdit->setText("");
81 xSpacingLineEdit->setText("");
82 ySpacingLineEdit->setText("");
83 zSpacingLineEdit->setText("");
84 scaleSizeLineEdit->setText("");
85 scaleSpacingLineEdit->setText("");
87 sizeRadioButton->setChecked(0);
88 scaleSizeRadioButton->setChecked(0);
89 isoSizeRadioButton->setChecked(0);
90 spacingRadioButton->setChecked(0);
91 scaleSpacingRadioButton->setChecked(0);
92 isoSpacingRadioButton->setChecked(0);
94 gaussianFilterCheckBox->setCheckState(Qt::Unchecked);
96 xGaussianLineEdit->hide();
97 yGaussianLineEdit->hide();
98 zGaussianLineEdit->hide();
99 gaussianFilterLabel->hide();
101 bSplineLabel->hide();
102 bSplineOrderSpinBox->hide();
103 bLUTFactorLabel->hide();
108 qPalette.setColor(QPalette::Foreground, QColor(Qt::blue));
109 mInputFormatLabel->setPalette(qPalette);
110 mInputDimLabel->setPalette(qPalette);
111 mInputPixelTypeLabel->setPalette(qPalette);
112 mInputSizeLabel->setPalette(qPalette);
113 mInputSpacingLabel->setPalette(qPalette);
115 UpdateCurrentInputImage();
117 //====================================================================
119 //====================================================================
120 void vvResamplerDialog::UpdateCurrentInputImage() {
121 // Set current image & index
122 mCurrentIndex = mImagesComboBox->currentIndex();
123 if (mCurrentIndex == -1) {
124 mCurrentImage = NULL;
127 mCurrentImage = mSlicerManagers[mCurrentIndex]->GetSlicer(0)->GetImage();
128 if (mCurrentImage.IsNull()) return;
129 mInputFileName = mSlicerManagers[mCurrentIndex]->GetFileName().c_str();
131 // Set current information
132 mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
133 //ds ComponentType = mCurrentImageGetNumberOfScalarComponents();
134 mDimension = mCurrentImage->GetNumberOfDimensions();
136 // Copy size, spacing ...
137 mInputOrigin.resize(mDimension);
138 mInputSpacing.resize(mDimension);
139 mInputSize.resize(mDimension);
140 for (int i = 0; i < mDimension;i++) {
141 mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
142 mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
143 mInputSize[i] = mCurrentImage->GetSize()[i];
147 mInputFileFormat = itksys::SystemTools::GetFilenameLastExtension(mInputFileName.toStdString()).c_str();
150 mInputFormatLabel->setText(mInputFileFormat);
151 mInputSizeLabel->setText(GetVectorIntAsString(mInputSize));
152 mInputDimLabel->setText(QString::number(mDimension)+"D");
153 mInputSpacingLabel->setText(GetVectorDoubleAsString(mInputSpacing));
154 mInputPixelTypeLabel->setText(mPixelType);
155 mInputMemoryLabel->setText(GetSizeInBytes(mInputSize));
158 scaleSizeRadioButton->setChecked(true);
159 UpdateControlSizeAndSpacing();
160 scaleSizeLineEdit->setText("100");
161 ComputeNewSizeFromScale();
166 //====================================================================
168 //====================================================================
169 void vvResamplerDialog::UpdateOutputInfo() {
170 mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
171 mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
172 mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
174 //====================================================================
176 //====================================================================
177 QString vvResamplerDialog::GetSizeInBytes(std::vector<int> & size) {
179 for (unsigned int i=0; i<size.size(); i++) t *= size[i];
180 t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
181 QString result = QString::number(t);
182 result += " bytes (";
183 if (t > 1000000000) {
185 result += QString::number(t);
188 else if (t > 1000000) {
190 result += QString::number(t);
195 result += QString::number(t);
200 //====================================================================
202 //====================================================================
203 QString vvResamplerDialog::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
205 for (unsigned int i= 0; i<vectorDouble.size(); i++) {
208 result += QString::number(vectorDouble[i]);
212 //====================================================================
214 //====================================================================
215 QString vvResamplerDialog::GetVectorIntAsString(std::vector<int> vectorInt) {
217 for (unsigned int i= 0; i<vectorInt.size(); i++) {
220 result += QString::number(vectorInt[i]);
224 //====================================================================
226 //====================================================================
227 void vvResamplerDialog::FillSizeEdit(std::vector<int> size) {
228 xSizeLineEdit->setText(QString::number(size[0]));
229 ySizeLineEdit->setText(QString::number(size[1]));
231 zSizeLineEdit->setText(QString::number(size[2]));
233 //====================================================================
235 //====================================================================
236 void vvResamplerDialog::FillSpacingEdit(std::vector<double> spacing) {
237 xSpacingLineEdit->setText(QString::number(spacing[0]));
238 ySpacingLineEdit->setText(QString::number(spacing[1]));
239 if (spacing.size() > 2)
240 zSpacingLineEdit->setText(QString::number(spacing[2]));
242 //====================================================================
244 //====================================================================
245 void vvResamplerDialog::UpdateOutputSizeAndSpacing() {
246 mOutputSize.resize(mDimension);
247 mOutputSize = mInputSize;
248 mOutputSpacing.resize(mDimension);
249 mOutputSpacing = mInputSpacing;
250 mOutputSize[0] = (int)xSizeLineEdit->text().toDouble();
251 mOutputSize[1] = (int)ySizeLineEdit->text().toDouble();
253 mOutputSize[2] = (int)zSizeLineEdit->text().toDouble();
255 mOutputSpacing[0] = xSpacingLineEdit->text().toDouble();
256 mOutputSpacing[1] = ySpacingLineEdit->text().toDouble();
258 mOutputSpacing[2] = zSpacingLineEdit->text().toDouble();
262 //====================================================================
264 //====================================================================
265 void vvResamplerDialog::UpdateControlSizeAndSpacing() {
266 scaleSizeLineEdit->setText("");
267 scaleSpacingLineEdit->setText("");
268 isoSizeLineEdit->setText("");
269 isoSpacingLineEdit->setText("");
271 xSizeLineEdit->setReadOnly(1);
272 ySizeLineEdit->setReadOnly(1);
273 zSizeLineEdit->setReadOnly(1);
274 scaleSizeLineEdit->setReadOnly(1);
275 isoSizeLineEdit->setReadOnly(1);
277 xSpacingLineEdit->setReadOnly(1);
278 ySpacingLineEdit->setReadOnly(1);
279 zSpacingLineEdit->setReadOnly(1);
280 scaleSpacingLineEdit->setReadOnly(1);
281 isoSpacingLineEdit->setReadOnly(1);
283 if (sizeRadioButton->isChecked()) {
284 xSizeLineEdit->setReadOnly(0);
285 ySizeLineEdit->setReadOnly(0);
287 zSizeLineEdit->setReadOnly(0);
290 if (spacingRadioButton->isChecked()) {
291 xSpacingLineEdit->setReadOnly(0);
292 ySpacingLineEdit->setReadOnly(0);
294 zSpacingLineEdit->setReadOnly(0);
296 else if (scaleSizeRadioButton->isChecked())
297 scaleSizeLineEdit->setReadOnly(0);
298 else if (scaleSpacingRadioButton->isChecked())
299 scaleSpacingLineEdit->setReadOnly(0);
300 else if (isoSizeRadioButton->isChecked())
301 isoSizeLineEdit->setReadOnly(0);
302 else if (isoSpacingRadioButton->isChecked())
303 isoSpacingLineEdit->setReadOnly(0);
306 //====================================================================
308 //====================================================================
309 void vvResamplerDialog::ComputeNewSpacingFromSize() {
310 double newSpacing = mInputSpacing[0]*mInputSize[0];
311 xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
312 newSpacing = mInputSpacing[1]*mInputSize[1];
313 ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
316 newSpacing = mInputSpacing[2]*mInputSize[2];
317 zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
319 UpdateOutputSizeAndSpacing();
321 //====================================================================
323 //====================================================================
324 void vvResamplerDialog::ComputeNewSizeFromSpacing() {
325 double newSize = mInputSpacing[0]*mInputSize[0];
326 xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
327 newSize = mInputSpacing[1]*mInputSize[1];
328 ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
331 newSize = mInputSpacing[2]*mInputSize[2];
332 zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
334 UpdateOutputSizeAndSpacing();
336 //====================================================================
338 //====================================================================
339 void vvResamplerDialog::ComputeNewSpacingFromScale() {
340 xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
341 ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
343 zSpacingLineEdit->setText(QString::number(mInputSpacing[2]*scaleSpacingLineEdit->text().toDouble()/100));
344 ComputeNewSizeFromSpacing();
346 //====================================================================
348 //====================================================================
349 void vvResamplerDialog::ComputeNewSizeFromScale() {
350 xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
351 ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
353 zSizeLineEdit->setText(QString::number(mInputSize[2]*scaleSizeLineEdit->text().toDouble()/100));
354 ComputeNewSpacingFromSize();
356 //====================================================================
358 //====================================================================
359 void vvResamplerDialog::ComputeNewSpacingFromIso() {
360 xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
361 ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
363 zSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
364 ComputeNewSizeFromSpacing();
366 //====================================================================
368 //====================================================================
369 void vvResamplerDialog::ComputeNewSizeFromIso() {
370 xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
371 ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
373 zSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
374 ComputeNewSpacingFromSize();
376 //====================================================================
378 //====================================================================
379 void vvResamplerDialog::UpdateInterpolation() {
380 if (interpolationComboBox->currentText() == "BSpline") {
381 bSplineLabel->show();
382 bSplineOrderSpinBox->show();
383 bLUTFactorLabel->hide();
386 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
387 bSplineLabel->show();
388 bSplineOrderSpinBox->show();
389 bLUTFactorLabel->show();
393 bSplineLabel->hide();
394 bSplineOrderSpinBox->hide();
395 bLUTFactorLabel->hide();
399 //====================================================================
401 //====================================================================
402 void vvResamplerDialog::UpdateGaussianFilter() {
403 if (gaussianFilterCheckBox->isChecked()) {
404 gaussianFilterLabel->show();
405 xGaussianLineEdit->show();
406 yGaussianLineEdit->show();
408 zGaussianLineEdit->show();
411 gaussianFilterLabel->hide();
412 xGaussianLineEdit->hide();
413 yGaussianLineEdit->hide();
414 zGaussianLineEdit->hide();
417 //====================================================================
419 //====================================================================
420 void vvResamplerDialog::SetSlicerManagers(std::vector<vvSlicerManager*> & m,int current_image_index) {
422 for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
423 mImagesComboBox->addItem(mSlicerManagers[i]->GetFileName().c_str());
425 mImagesComboBox->setCurrentIndex(current_image_index);
427 //====================================================================
429 //====================================================================
430 void vvResamplerDialog::Resample() {
432 // Get resampler options
433 std::vector<double> sigma;
434 sigma.push_back(xGaussianLineEdit->text().toDouble());
435 sigma.push_back(yGaussianLineEdit->text().toDouble());
436 if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
439 // Create resampler filter
440 clitk::ImageResampleGenericFilter::Pointer filter = clitk::ImageResampleGenericFilter::New();
441 filter->SetOutputSize(mOutputSize);
442 filter->SetOutputSpacing(mOutputSpacing);
443 filter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
445 if (interpolationComboBox->currentText() == "BSpline")
446 filter->SetBSplineOrder(bSplineOrderSpinBox->value());
447 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
448 filter->SetInterpolationName("blut");
449 filter->SetBSplineOrder(bSplineOrderSpinBox->value());
450 filter->SetBLUTSampling(bLUTSpinBox->value());
452 if (gaussianFilterCheckBox->isChecked())
453 filter->SetGaussianSigma(sigma);
454 // filter->SetOutputFileName(OutputFileName.toStdString());
455 filter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
456 filter->SetInputVVImage(mCurrentImage);
460 mOutput = filter->GetOutputVVImage();
462 //====================================================================
463 std::string vvResamplerDialog::GetOutputFileName()
465 QFileInfo info(mImagesComboBox->currentText());
466 return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
469 #endif /* end #define _vvResamplerDialog_CXX */