1 #ifndef _vvResamplerDialog_CXX
2 #define _vvResamplerDialog_CXX
3 #include "vvResamplerDialog.h"
4 #include "clitkImageResampleGenericFilter.h"
10 #define COLUMN_IMAGE_NAME 7
12 //====================================================================
13 vvResamplerDialog::vvResamplerDialog(QWidget * parent, Qt::WindowFlags f)
14 :QDialog(parent,f), Ui::vvResamplerDialog() {
20 // Connect signals & slots
21 connect(this, SIGNAL(accepted()), this, SLOT(Resample()));
22 connect(mImagesComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(UpdateCurrentInputImage()));
24 connect(sizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
25 connect(scaleSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
26 connect(isoSizeRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
27 connect(spacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
28 connect(scaleSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
29 connect(isoSpacingRadioButton, SIGNAL(clicked()), this, SLOT(UpdateControlSizeAndSpacing()));
31 connect(xSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
32 connect(ySizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
33 connect(zSizeLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromSize()));
34 connect(xSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
35 connect(ySpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
36 connect(zSpacingLineEdit, SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromSpacing()));
37 connect(scaleSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromScale()));
38 connect(scaleSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromScale()));
39 connect(isoSizeLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSizeFromIso()));
40 connect(isoSpacingLineEdit,SIGNAL(textEdited(QString)),this,SLOT(ComputeNewSpacingFromIso()));
42 connect(gaussianFilterCheckBox,SIGNAL(stateChanged(int)),this,SLOT(UpdateGaussianFilter()));
43 connect(interpolationComboBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(UpdateInterpolation()));
45 //====================================================================
47 //====================================================================
48 void vvResamplerDialog::Init() {
51 mInputFileFormat = "";
56 mInputSpacing.resize(0);
57 mInputOrigin.resize(0);
58 mOutputSize.resize(0);
59 mOutputSpacing.resize(0);
61 xSizeLineEdit->setText("");
62 ySizeLineEdit->setText("");
63 zSizeLineEdit->setText("");
64 xSpacingLineEdit->setText("");
65 ySpacingLineEdit->setText("");
66 zSpacingLineEdit->setText("");
67 scaleSizeLineEdit->setText("");
68 scaleSpacingLineEdit->setText("");
70 sizeRadioButton->setChecked(0);
71 scaleSizeRadioButton->setChecked(0);
72 isoSizeRadioButton->setChecked(0);
73 spacingRadioButton->setChecked(0);
74 scaleSpacingRadioButton->setChecked(0);
75 isoSpacingRadioButton->setChecked(0);
77 gaussianFilterCheckBox->setCheckState(Qt::Unchecked);
79 xGaussianLineEdit->hide();
80 yGaussianLineEdit->hide();
81 zGaussianLineEdit->hide();
82 gaussianFilterLabel->hide();
85 bSplineOrderSpinBox->hide();
86 bLUTFactorLabel->hide();
91 qPalette.setColor(QPalette::Foreground, QColor(Qt::blue));
92 mInputFormatLabel->setPalette(qPalette);
93 mInputDimLabel->setPalette(qPalette);
94 mInputPixelTypeLabel->setPalette(qPalette);
95 mInputSizeLabel->setPalette(qPalette);
96 mInputSpacingLabel->setPalette(qPalette);
98 UpdateCurrentInputImage();
100 //====================================================================
102 //====================================================================
103 void vvResamplerDialog::UpdateCurrentInputImage() {
104 // Set current image & index
105 mCurrentIndex = mImagesComboBox->currentIndex();
106 if (mCurrentIndex == -1) {
107 mCurrentImage = NULL;
110 mCurrentImage = mSlicerManagers[mCurrentIndex]->GetSlicer(0)->GetImage();
111 if (mCurrentImage.IsNull()) return;
112 mInputFileName = mSlicerManagers[mCurrentIndex]->GetFileName().c_str();
114 // Set current information
115 mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
116 //ds ComponentType = mCurrentImageGetNumberOfScalarComponents();
117 mDimension = mCurrentImage->GetNumberOfDimensions();
119 // Copy size, spacing ...
120 mInputOrigin.resize(mDimension);
121 mInputSpacing.resize(mDimension);
122 mInputSize.resize(mDimension);
123 for (int i = 0; i < mDimension;i++) {
124 mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
125 mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
126 mInputSize[i] = mCurrentImage->GetSize()[i];
130 mInputFileFormat = itksys::SystemTools::GetFilenameLastExtension(mInputFileName.toStdString()).c_str();
133 mInputFormatLabel->setText(mInputFileFormat);
134 mInputSizeLabel->setText(GetVectorIntAsString(mInputSize));
135 mInputDimLabel->setText(QString::number(mDimension)+"D");
136 mInputSpacingLabel->setText(GetVectorDoubleAsString(mInputSpacing));
137 mInputPixelTypeLabel->setText(mPixelType);
138 mInputMemoryLabel->setText(GetSizeInBytes(mInputSize));
141 scaleSizeRadioButton->setChecked(true);
142 UpdateControlSizeAndSpacing();
143 scaleSizeLineEdit->setText("100");
144 ComputeNewSizeFromScale();
149 //====================================================================
151 //====================================================================
152 void vvResamplerDialog::UpdateOutputInfo() {
153 mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
154 mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
155 mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
157 //====================================================================
159 //====================================================================
160 QString vvResamplerDialog::GetSizeInBytes(std::vector<int> & size) {
162 for (unsigned int i=0; i<size.size(); i++) t *= size[i];
163 t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
164 QString result = QString::number(t);
165 result += " bytes (";
166 if (t > 1000000000) {
168 result += QString::number(t);
171 else if (t > 1000000) {
173 result += QString::number(t);
178 result += QString::number(t);
183 //====================================================================
185 //====================================================================
186 QString vvResamplerDialog::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
188 for (unsigned int i= 0; i<vectorDouble.size(); i++) {
191 result += QString::number(vectorDouble[i]);
195 //====================================================================
197 //====================================================================
198 QString vvResamplerDialog::GetVectorIntAsString(std::vector<int> vectorInt) {
200 for (unsigned int i= 0; i<vectorInt.size(); i++) {
203 result += QString::number(vectorInt[i]);
207 //====================================================================
209 //====================================================================
210 void vvResamplerDialog::FillSizeEdit(std::vector<int> size) {
211 xSizeLineEdit->setText(QString::number(size[0]));
212 ySizeLineEdit->setText(QString::number(size[1]));
214 zSizeLineEdit->setText(QString::number(size[2]));
216 //====================================================================
218 //====================================================================
219 void vvResamplerDialog::FillSpacingEdit(std::vector<double> spacing) {
220 xSpacingLineEdit->setText(QString::number(spacing[0]));
221 ySpacingLineEdit->setText(QString::number(spacing[1]));
222 if (spacing.size() > 2)
223 zSpacingLineEdit->setText(QString::number(spacing[2]));
225 //====================================================================
227 //====================================================================
228 void vvResamplerDialog::UpdateOutputSizeAndSpacing() {
229 mOutputSize.resize(mDimension);
230 mOutputSize = mInputSize;
231 mOutputSpacing.resize(mDimension);
232 mOutputSpacing = mInputSpacing;
233 mOutputSize[0] = (int)xSizeLineEdit->text().toDouble();
234 mOutputSize[1] = (int)ySizeLineEdit->text().toDouble();
236 mOutputSize[2] = (int)zSizeLineEdit->text().toDouble();
238 mOutputSpacing[0] = xSpacingLineEdit->text().toDouble();
239 mOutputSpacing[1] = ySpacingLineEdit->text().toDouble();
241 mOutputSpacing[2] = zSpacingLineEdit->text().toDouble();
245 //====================================================================
247 //====================================================================
248 void vvResamplerDialog::UpdateControlSizeAndSpacing() {
249 scaleSizeLineEdit->setText("");
250 scaleSpacingLineEdit->setText("");
251 isoSizeLineEdit->setText("");
252 isoSpacingLineEdit->setText("");
254 xSizeLineEdit->setReadOnly(1);
255 ySizeLineEdit->setReadOnly(1);
256 zSizeLineEdit->setReadOnly(1);
257 scaleSizeLineEdit->setReadOnly(1);
258 isoSizeLineEdit->setReadOnly(1);
260 xSpacingLineEdit->setReadOnly(1);
261 ySpacingLineEdit->setReadOnly(1);
262 zSpacingLineEdit->setReadOnly(1);
263 scaleSpacingLineEdit->setReadOnly(1);
264 isoSpacingLineEdit->setReadOnly(1);
266 if (sizeRadioButton->isChecked()) {
267 xSizeLineEdit->setReadOnly(0);
268 ySizeLineEdit->setReadOnly(0);
270 zSizeLineEdit->setReadOnly(0);
273 if (spacingRadioButton->isChecked()) {
274 xSpacingLineEdit->setReadOnly(0);
275 ySpacingLineEdit->setReadOnly(0);
277 zSpacingLineEdit->setReadOnly(0);
279 else if (scaleSizeRadioButton->isChecked())
280 scaleSizeLineEdit->setReadOnly(0);
281 else if (scaleSpacingRadioButton->isChecked())
282 scaleSpacingLineEdit->setReadOnly(0);
283 else if (isoSizeRadioButton->isChecked())
284 isoSizeLineEdit->setReadOnly(0);
285 else if (isoSpacingRadioButton->isChecked())
286 isoSpacingLineEdit->setReadOnly(0);
289 //====================================================================
291 //====================================================================
292 void vvResamplerDialog::ComputeNewSpacingFromSize() {
293 double newSpacing = mInputSpacing[0]*mInputSize[0];
294 xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
295 newSpacing = mInputSpacing[1]*mInputSize[1];
296 ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
299 newSpacing = mInputSpacing[2]*mInputSize[2];
300 zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
302 UpdateOutputSizeAndSpacing();
304 //====================================================================
306 //====================================================================
307 void vvResamplerDialog::ComputeNewSizeFromSpacing() {
308 double newSize = mInputSpacing[0]*mInputSize[0];
309 xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
310 newSize = mInputSpacing[1]*mInputSize[1];
311 ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
314 newSize = mInputSpacing[2]*mInputSize[2];
315 zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
317 UpdateOutputSizeAndSpacing();
319 //====================================================================
321 //====================================================================
322 void vvResamplerDialog::ComputeNewSpacingFromScale() {
323 xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
324 ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
326 zSpacingLineEdit->setText(QString::number(mInputSpacing[2]*scaleSpacingLineEdit->text().toDouble()/100));
327 ComputeNewSizeFromSpacing();
329 //====================================================================
331 //====================================================================
332 void vvResamplerDialog::ComputeNewSizeFromScale() {
333 xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
334 ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
336 zSizeLineEdit->setText(QString::number(mInputSize[2]*scaleSizeLineEdit->text().toDouble()/100));
337 ComputeNewSpacingFromSize();
339 //====================================================================
341 //====================================================================
342 void vvResamplerDialog::ComputeNewSpacingFromIso() {
343 xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
344 ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
346 zSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
347 ComputeNewSizeFromSpacing();
349 //====================================================================
351 //====================================================================
352 void vvResamplerDialog::ComputeNewSizeFromIso() {
353 xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
354 ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
356 zSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
357 ComputeNewSpacingFromSize();
359 //====================================================================
361 //====================================================================
362 void vvResamplerDialog::UpdateInterpolation() {
363 if (interpolationComboBox->currentText() == "BSpline") {
364 bSplineLabel->show();
365 bSplineOrderSpinBox->show();
366 bLUTFactorLabel->hide();
369 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
370 bSplineLabel->show();
371 bSplineOrderSpinBox->show();
372 bLUTFactorLabel->show();
376 bSplineLabel->hide();
377 bSplineOrderSpinBox->hide();
378 bLUTFactorLabel->hide();
382 //====================================================================
384 //====================================================================
385 void vvResamplerDialog::UpdateGaussianFilter() {
386 if (gaussianFilterCheckBox->isChecked()) {
387 gaussianFilterLabel->show();
388 xGaussianLineEdit->show();
389 yGaussianLineEdit->show();
391 zGaussianLineEdit->show();
394 gaussianFilterLabel->hide();
395 xGaussianLineEdit->hide();
396 yGaussianLineEdit->hide();
397 zGaussianLineEdit->hide();
400 //====================================================================
402 //====================================================================
403 void vvResamplerDialog::SetSlicerManagers(std::vector<vvSlicerManager*> & m,int current_image_index) {
405 for (unsigned int i = 0; i < mSlicerManagers.size(); i++) {
406 mImagesComboBox->addItem(mSlicerManagers[i]->GetFileName().c_str());
408 mImagesComboBox->setCurrentIndex(current_image_index);
410 //====================================================================
412 //====================================================================
413 void vvResamplerDialog::Resample() {
415 // Get resampler options
416 std::vector<double> sigma;
417 sigma.push_back(xGaussianLineEdit->text().toDouble());
418 sigma.push_back(yGaussianLineEdit->text().toDouble());
419 if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
422 // Create resampler filter
423 clitk::ImageResampleGenericFilter::Pointer filter = clitk::ImageResampleGenericFilter::New();
424 filter->SetOutputSize(mOutputSize);
425 filter->SetOutputSpacing(mOutputSpacing);
426 filter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
428 if (interpolationComboBox->currentText() == "BSpline")
429 filter->SetBSplineOrder(bSplineOrderSpinBox->value());
430 else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
431 filter->SetInterpolationName("blut");
432 filter->SetBSplineOrder(bSplineOrderSpinBox->value());
433 filter->SetBLUTSampling(bLUTSpinBox->value());
435 if (gaussianFilterCheckBox->isChecked())
436 filter->SetGaussianSigma(sigma);
437 // filter->SetOutputFileName(OutputFileName.toStdString());
438 filter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
439 filter->SetInputVVImage(mCurrentImage);
443 mOutput = filter->GetOutputVVImage();
445 //====================================================================
446 std::string vvResamplerDialog::GetOutputFileName()
448 QFileInfo info(mImagesComboBox->currentText());
449 return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
452 #endif /* end #define _vvResamplerDialog_CXX */