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),
36 Ui_vvToolResample::setupUi(mToolWidget);
38 mFilter = clitk::ImageResampleGenericFilter::New();
41 mInputFileFormat = "";
44 mCurrentSlicerManager=NULL;
47 mInputSpacing.resize(0);
48 mInputOrigin.resize(0);
49 mOutputSize.resize(0);
50 mOutputSpacing.resize(0);
52 xSizeLineEdit->setText("");
53 ySizeLineEdit->setText("");
54 zSizeLineEdit->setText("");
55 xSpacingLineEdit->setText("");
56 ySpacingLineEdit->setText("");
57 zSpacingLineEdit->setText("");
58 scaleSizeLineEdit->setText("");
59 scaleSpacingLineEdit->setText("");
61 sizeRadioButton->setChecked(0);
62 scaleSizeRadioButton->setChecked(0);
63 isoSizeRadioButton->setChecked(0);
64 spacingRadioButton->setChecked(0);
65 scaleSpacingRadioButton->setChecked(0);
66 isoSpacingRadioButton->setChecked(0);
68 gaussianFilterCheckBox->setCheckState(Qt::Unchecked);
70 xGaussianLineEdit->hide();
71 yGaussianLineEdit->hide();
72 zGaussianLineEdit->hide();
73 gaussianFilterLabel->hide();
76 bSplineOrderSpinBox->hide();
77 bLUTFactorLabel->hide();
82 qPalette.setColor(QPalette::Foreground, QColor(Qt::blue));
83 mInputFormatLabel->setPalette(qPalette);
84 mInputDimLabel->setPalette(qPalette);
85 mInputPixelTypeLabel->setPalette(qPalette);
86 mInputSizeLabel->setPalette(qPalette);
87 mInputSpacingLabel->setPalette(qPalette);
89 // Set how many inputs are needed for this tool
90 AddInputSelector("Select an image to resample", mFilter);
92 // Connect signals & slots
94 connect(sizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
95 connect(scaleSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
96 connect(isoSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
97 connect(spacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
98 connect(scaleSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
99 connect(isoSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
101 connect(xSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
102 connect(ySizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
103 connect(zSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
104 connect(xSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
105 connect(ySpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
106 connect(zSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
107 connect(scaleSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromScale()));
108 connect(scaleSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromScale()));
109 connect(isoSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromIso()));
110 connect(isoSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromIso()));
112 connect(gaussianFilterCheckBox,SIGNAL(stateChanged(int)),this,SLOT(UpdateGaussianFilter()));
113 connect(interpolationComboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(UpdateInterpolation()));
115 //====================================================================
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 //====================================================================
126 //====================================================================
127 void vvToolResample::InputIsSelected(vvSlicerManager* m) {
129 mCurrentSlicerManager = m;
130 mCurrentImage = mCurrentSlicerManager->GetSlicer(0)->GetImage();
131 if (mCurrentImage.IsNull()) return;
132 mInputFileName = mCurrentSlicerManager->GetFileName().c_str();
134 // Set current information
135 mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
136 //ds ComponentType = mCurrentImageGetNumberOfScalarComponents();
137 mDimension = mCurrentImage->GetNumberOfDimensions();
139 // Copy size, spacing ...
140 mInputOrigin.resize(mDimension);
141 mInputSpacing.resize(mDimension);
142 mInputSize.resize(mDimension);
143 for (int i = 0; i < mDimension;i++) {
144 mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
145 mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
146 mInputSize[i] = mCurrentImage->GetSize()[i];
150 mInputFileFormat = itksys::SystemTools::GetFilenameLastExtension(mInputFileName.toStdString()).c_str();
153 mInputFormatLabel->setText(mInputFileFormat);
154 mInputSizeLabel->setText(GetVectorIntAsString(mInputSize));
155 mInputDimLabel->setText(QString::number(mDimension)+"D");
156 mInputSpacingLabel->setText(GetVectorDoubleAsString(mInputSpacing));
157 mInputPixelTypeLabel->setText(mPixelType);
158 mInputMemoryLabel->setText(GetSizeInBytes(mInputSize));
161 scaleSizeRadioButton->setChecked(true);
162 UpdateControlSizeAndSpacing();
163 scaleSizeLineEdit->setText("100");
164 ComputeNewSizeFromScale();
169 //====================================================================
171 //====================================================================
172 void vvToolResample::UpdateOutputInfo() {
173 mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
174 mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
175 mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
177 //====================================================================
179 //====================================================================
180 QString vvToolResample::GetSizeInBytes(std::vector<int> & size) {
182 for (unsigned int i=0; i<size.size(); i++) t *= size[i];
183 t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
184 QString result = QString::number(t);
185 result += " bytes (";
186 if (t > 1000000000) {
188 result += QString::number(t);
191 else if (t > 1000000) {
193 result += QString::number(t);
198 result += QString::number(t);
203 //====================================================================
205 //====================================================================
206 QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
208 for (unsigned int i= 0; i<vectorDouble.size(); i++) {
211 result += QString::number(vectorDouble[i]);
215 //====================================================================
217 //====================================================================
218 QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt) {
220 for (unsigned int i= 0; i<vectorInt.size(); i++) {
223 result += QString::number(vectorInt[i]);
227 //====================================================================
229 //====================================================================
230 void vvToolResample::FillSizeEdit(std::vector<int> size) {
231 xSizeLineEdit->setText(QString::number(size[0]));
232 ySizeLineEdit->setText(QString::number(size[1]));
234 zSizeLineEdit->setText(QString::number(size[2]));
236 //====================================================================
238 //====================================================================
239 void vvToolResample::FillSpacingEdit(std::vector<double> spacing) {
240 xSpacingLineEdit->setText(QString::number(spacing[0]));
241 ySpacingLineEdit->setText(QString::number(spacing[1]));
242 if (spacing.size() > 2)
243 zSpacingLineEdit->setText(QString::number(spacing[2]));
245 //====================================================================
247 //====================================================================
248 void vvToolResample::UpdateOutputSizeAndSpacing() {
249 mOutputSize.resize(mDimension);
250 mOutputSize = mInputSize;
251 mOutputSpacing.resize(mDimension);
252 mOutputSpacing = mInputSpacing;
253 mOutputSize[0] = (int)xSizeLineEdit->text().toDouble();
254 mOutputSize[1] = (int)ySizeLineEdit->text().toDouble();
256 mOutputSize[2] = (int)zSizeLineEdit->text().toDouble();
258 mOutputSpacing[0] = xSpacingLineEdit->text().toDouble();
259 mOutputSpacing[1] = ySpacingLineEdit->text().toDouble();
261 mOutputSpacing[2] = zSpacingLineEdit->text().toDouble();
265 //====================================================================
267 //====================================================================
268 void vvToolResample::UpdateControlSizeAndSpacing() {
269 scaleSizeLineEdit->setText("");
270 scaleSpacingLineEdit->setText("");
271 isoSizeLineEdit->setText("");
272 isoSpacingLineEdit->setText("");
274 xSizeLineEdit->setReadOnly(1);
275 ySizeLineEdit->setReadOnly(1);
276 zSizeLineEdit->setReadOnly(1);
277 scaleSizeLineEdit->setReadOnly(1);
278 isoSizeLineEdit->setReadOnly(1);
280 xSpacingLineEdit->setReadOnly(1);
281 ySpacingLineEdit->setReadOnly(1);
282 zSpacingLineEdit->setReadOnly(1);
283 scaleSpacingLineEdit->setReadOnly(1);
284 isoSpacingLineEdit->setReadOnly(1);
286 if (sizeRadioButton->isChecked()) {
287 xSizeLineEdit->setReadOnly(0);
288 ySizeLineEdit->setReadOnly(0);
290 zSizeLineEdit->setReadOnly(0);
293 if (spacingRadioButton->isChecked()) {
294 xSpacingLineEdit->setReadOnly(0);
295 ySpacingLineEdit->setReadOnly(0);
297 zSpacingLineEdit->setReadOnly(0);
299 else if (scaleSizeRadioButton->isChecked())
300 scaleSizeLineEdit->setReadOnly(0);
301 else if (scaleSpacingRadioButton->isChecked())
302 scaleSpacingLineEdit->setReadOnly(0);
303 else if (isoSizeRadioButton->isChecked())
304 isoSizeLineEdit->setReadOnly(0);
305 else if (isoSpacingRadioButton->isChecked())
306 isoSpacingLineEdit->setReadOnly(0);
309 //====================================================================
311 //====================================================================
312 void vvToolResample::ComputeNewSpacingFromSize() {
313 double newSpacing = mInputSpacing[0]*mInputSize[0];
314 xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
315 newSpacing = mInputSpacing[1]*mInputSize[1];
316 ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
319 newSpacing = mInputSpacing[2]*mInputSize[2];
320 zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
322 UpdateOutputSizeAndSpacing();
324 //====================================================================
326 //====================================================================
327 void vvToolResample::ComputeNewSizeFromSpacing() {
328 double newSize = mInputSpacing[0]*mInputSize[0];
329 xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
330 newSize = mInputSpacing[1]*mInputSize[1];
331 ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
334 newSize = mInputSpacing[2]*mInputSize[2];
335 zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
337 UpdateOutputSizeAndSpacing();
339 //====================================================================
341 //====================================================================
342 void vvToolResample::ComputeNewSpacingFromScale() {
343 xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
344 ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
346 zSpacingLineEdit->setText(QString::number(mInputSpacing[2]*scaleSpacingLineEdit->text().toDouble()/100));
347 ComputeNewSizeFromSpacing();
349 //====================================================================
351 //====================================================================
352 void vvToolResample::ComputeNewSizeFromScale() {
353 xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
354 ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
356 zSizeLineEdit->setText(QString::number(mInputSize[2]*scaleSizeLineEdit->text().toDouble()/100));
357 ComputeNewSpacingFromSize();
359 //====================================================================
361 //====================================================================
362 void vvToolResample::ComputeNewSpacingFromIso() {
363 xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
364 ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
366 zSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
367 ComputeNewSizeFromSpacing();
369 //====================================================================
371 //====================================================================
372 void vvToolResample::ComputeNewSizeFromIso() {
373 xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
374 ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
376 zSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
377 ComputeNewSpacingFromSize();
379 //====================================================================
381 //====================================================================
382 void vvToolResample::UpdateInterpolation() {
383 if (interpolationComboBox->currentText() == "BSpline") {
384 bSplineLabel->show();
385 bSplineOrderSpinBox->show();
386 bLUTFactorLabel->hide();
389 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
390 bSplineLabel->show();
391 bSplineOrderSpinBox->show();
392 bLUTFactorLabel->show();
396 bSplineLabel->hide();
397 bSplineOrderSpinBox->hide();
398 bLUTFactorLabel->hide();
402 //====================================================================
404 //====================================================================
405 void vvToolResample::UpdateGaussianFilter() {
406 if (gaussianFilterCheckBox->isChecked()) {
407 gaussianFilterLabel->show();
408 xGaussianLineEdit->show();
409 yGaussianLineEdit->show();
411 zGaussianLineEdit->show();
414 gaussianFilterLabel->hide();
415 xGaussianLineEdit->hide();
416 yGaussianLineEdit->hide();
417 zGaussianLineEdit->hide();
420 //====================================================================
423 //====================================================================
424 void vvToolResample::apply() {
426 // Get resampler options
427 std::vector<double> sigma;
428 sigma.push_back(xGaussianLineEdit->text().toDouble());
429 sigma.push_back(yGaussianLineEdit->text().toDouble());
430 if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
432 mFilter->SetOutputSize(mOutputSize);
433 mFilter->SetOutputSpacing(mOutputSpacing);
434 mFilter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
436 if (interpolationComboBox->currentText() == "BSpline")
437 mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
438 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
439 mFilter->SetInterpolationName("blut");
440 mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
441 mFilter->SetBLUTSampling(bLUTSpinBox->value());
443 if (gaussianFilterCheckBox->isChecked())
444 mFilter->SetGaussianSigma(sigma);
445 // mFilter->SetOutputFileName(OutputFileName.toStdString());
446 mFilter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
447 mFilter->SetInputVVImage(mCurrentImage);
451 mOutput = mFilter->GetOutputVVImage();
452 AddImage(mOutput,GetOutputFileName());
455 //====================================================================
456 std::string vvToolResample::GetOutputFileName()
458 QFileInfo info(QString(mCurrentSlicerManager->GetFileName().c_str()));
459 return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());