5 #include <QProgressDialog>
10 #include <itkWarpImageFilter.h>
11 #include <itkJoinSeriesImageFilter.h>
12 #include <itkImageFileReader.h>
13 #include <itkSubtractImageFilter.h>
14 #include <itkDisplacementFieldJacobianDeterminantFilter.h>
17 #include <vtksys/SystemTools.hxx>
18 #include <itksys/SystemTools.hxx>
20 #include "clitkCommon.h"
22 #include "vvDeformationDialog.h"
23 #include "vvDeformableRegistration.h"
26 #include "vvFromITK.h"
27 #include "vvSlicerManager.h"
29 vvSlicerManager * vvDeformationDialog::GetSelectedSlicer() const
31 return mSlicerManagers[inputSequenceBox->currentIndex()];
34 int vvDeformationDialog::GetReferenceFrameIndex() const
36 return refImageSlider->value();
39 vvDeformationDialog::vvDeformationDialog(int initialSlicer,const std::vector<vvSlicerManager*>& slicerManagers)
40 : mSlicerManagers(slicerManagers)
43 connect(this,SIGNAL(accepted()),this,SLOT(computeDeformationField()));
44 for (unsigned int i=0;i<slicerManagers.size();i++)
45 inputSequenceBox->addItem(vtksys::SystemTools::GetFilenameName(slicerManagers[i]->GetFileName()).c_str());
46 connect(inputSequenceBox,SIGNAL(currentIndexChanged(int)),this,SLOT(resetSlider(int)));
47 connect(refImageSlider,SIGNAL(valueChanged(int)),this,SLOT(updateSliderLabel(int)));
48 connect(outputPushButton, SIGNAL(clicked()), this, SLOT(selectOutputFile()));
49 inputSequenceBox->setCurrentIndex(initialSlicer);
50 resetSlider(initialSlicer);
52 //Compute ideal number of threads and update dialog accordingly
53 int best_thread=QThread::idealThreadCount();
54 threadSpin->setValue(best_thread);
58 void vvDeformationDialog::selectOutputFile()
60 QString Extensions = "MHD Images( *.mhd);;";
61 QString fileName = QFileDialog::getSaveFileName(this,
63 itksys::SystemTools::GetFilenamePath(
64 mSlicerManagers[inputSequenceBox->currentIndex()]->GetFileName()).c_str(),
66 outputLineEdit->setText(fileName);
69 void vvDeformationDialog::updateSliderLabel(int refimage)
72 count.setNum(refimage); //Normal people start counting at 1...
73 QString newlabel="Reference Image (";
76 refImageLabel->setText(newlabel);
79 void vvDeformationDialog::resetSlider(int slicer_index)
81 refImageSlider->setRange(0,mSlicerManagers[slicer_index]->GetSlicer(0)->GetImage()->GetSize()[3]-1);
82 int refimage=mSlicerManagers[slicer_index]->GetSlicer(0)->GetTSlice();
83 refImageSlider->setSliderPosition(refimage);
84 updateSliderLabel(refimage);
87 void vvDeformationDialog::computeDeformationField() {
88 vvImage::Pointer sequence=mSlicerManagers[inputSequenceBox->currentIndex()]->GetSlicer(0)->GetImage();
89 vtkImageData * first_image = sequence->GetVTKImages()[0];
90 if (!sequence->IsTimeSequence())
92 this->setResult(QDialog::Rejected);
93 QMessageBox::warning(this,tr("Image type error"), tr("Deformable image registration only makes sense on time sequences."));
95 else if ((first_image->GetSpacing()[0] != first_image->GetSpacing()[1]) || (first_image->GetSpacing()[0] != first_image->GetSpacing()[2]))
97 this->setResult(QDialog::Rejected);
98 QMessageBox::warning(this,tr("Image type error"), tr("Deformable registration only works well with isotropic voxels. Please resample the image."));
103 QProgressDialog progress(this);
104 QProgressDialog cancel(this);
105 cancel.setLabelText("Canceling, please wait...");
106 cancel.setCancelButtonText(0);
108 //1 step per registration plus one for each of the image conversions
109 progress.setMaximum(mSlicerManagers[inputSequenceBox->currentIndex()]
110 ->GetSlicer(0)->GetImage()->GetSize()[3]+2);
111 progress.setLabelText("Computing deformation model...");
112 progress.setMinimumDuration(0);
113 progress.setWindowModality(Qt::WindowModal);
114 progress.setCancelButtonText("Cancel");
115 qApp->processEvents();
116 QFileInfo info(outputLineEdit->text().toStdString().c_str());
117 if (info.isRelative()) //this is a bit hackish, but should work
119 QFileInfo im_info(mSlicerManagers[inputSequenceBox->currentIndex()]->GetFileName().c_str());
120 outputLineEdit->setText((im_info.path().toStdString() + "/" + outputLineEdit->text().toStdString()).c_str());
122 vvDeformableRegistration registrator(sequence,refImageSlider->value(), iterSpin->value(),threadSpin->value(), alphaSpin->value(), sigmaSpin->value(),outputLineEdit->text().toStdString(),stopSpin->value());
124 while (!registrator.isFinished())
126 if (progress.wasCanceled() && !aborted)
128 this->setResult(QDialog::Rejected);
135 progress.setValue(registrator.getProgress());
136 qApp->processEvents();
137 registrator.wait(50);
141 mOutput=registrator.getOutput();