/*=========================================================================
Program: vv http://www.creatis.insa-lyon.fr/rio/vv
- Authors belong to:
+ Authors belong to:
- University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
+ - Léon Bérard cancer center http://www.centreleonberard.fr
- CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
This software is distributed WITHOUT ANY WARRANTY; without even
- BSD See included LICENSE.txt file
- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
- ======================================================================-====*/
+ ===========================================================================**/
+// vv
#include "vvToolResample.h"
#include "vvSlicer.h"
#include "vvToolCreator.h"
+// qt
#include <QFileInfo>
#include <QMessageBox>
+#include <QThread>
#define COLUMN_IMAGE_NAME 7
ADD_TOOL(vvToolResample);
+
+#define SetArgOptionString(OPTION, VALUE) \
+ { \
+ OPTION##_given = VALUE.size(); \
+ OPTION##_arg = new char[VALUE.size()]; \
+ strcpy(OPTION##_arg, VALUE.c_str()); \
+ }
+
//------------------------------------------------------------------------------
vvToolResample::vvToolResample(vvMainWindowBase * parent, Qt::WindowFlags f):
vvToolWidgetBase(parent,f),
vvToolBase<vvToolResample>(parent),
- Ui::vvToolResample() {
+ Ui::vvToolResample()
+{
Ui_vvToolResample::setupUi(mToolWidget);
- mFilter = clitk::ImageResampleGenericFilter::New();
+ mFilter = clitk::ResampleImageGenericFilter::New();
+ //mFilter = clitk::ImageResampleGenericFilter::New();
mLastError ="";
mInputFileFormat = "";
//------------------------------------------------------------------------------
-void vvToolResample::Initialize() {
+void vvToolResample::Initialize()
+{
SetToolName("Resample Image");
SetToolMenuName("Resample");
SetToolIconFilename(":/common/icons/resample.png");
//------------------------------------------------------------------------------
-void vvToolResample::InputIsSelected(vvSlicerManager* m) {
+void vvToolResample::InputIsSelected(vvSlicerManager* m)
+{
mCurrentSlicerManager = m;
mCurrentImage = mCurrentSlicerManager->GetSlicer(0)->GetImage();
mInputFileName = mCurrentSlicerManager->GetFileName().c_str();
// Set current information
- mPixelType = mCurrentImage->GetScalarTypeAsString().c_str();
+ mPixelType = mCurrentImage->GetScalarTypeAsITKString().c_str();
//ds ComponentType = mCurrentImageGetNumberOfScalarComponents();
mDimension = mCurrentImage->GetNumberOfDimensions();
mInputOrigin.resize(mDimension);
mInputSpacing.resize(mDimension);
mInputSize.resize(mDimension);
- for (int i = 0; i < mDimension;i++) {
+ for (int i = 0; i < mDimension; i++) {
mInputOrigin[i] = mCurrentImage->GetOrigin()[i];
mInputSpacing[i] = mCurrentImage->GetSpacing()[i];
mInputSize[i] = mCurrentImage->GetSize()[i];
//------------------------------------------------------------------------------
-void vvToolResample::UpdateOutputInfo() {
+void vvToolResample::UpdateOutputInfo()
+{
mOutputSizeLabel->setText(GetVectorIntAsString(mOutputSize));
mOutputSpacingLabel->setText(GetVectorDoubleAsString(mOutputSpacing));
mOutputMemoryLabel->setText(GetSizeInBytes(mOutputSize));
//------------------------------------------------------------------------------
-QString vvToolResample::GetSizeInBytes(std::vector<int> & size) {
+QString vvToolResample::GetSizeInBytes(std::vector<int> & size)
+{
int t = 1;
for (unsigned int i=0; i<size.size(); i++) t *= size[i];
t *= mCurrentImage->GetScalarSize()*mCurrentImage->GetNumberOfScalarComponents();
t /= 1000000000;
result += QString::number(t);
result += " GB)";
- }
- else if (t > 1000000) {
+ } else if (t > 1000000) {
t /= 1000000;
result += QString::number(t);
result += " MB)";
- }
- else if (t > 1000) {
+ } else if (t > 1000) {
t /= 1000;
result += QString::number(t);
result += " KB)";
- }
- else result += ")";
+ } else result += ")";
return result;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble) {
+QString vvToolResample::GetVectorDoubleAsString(std::vector<double> vectorDouble)
+{
QString result;
for (unsigned int i= 0; i<vectorDouble.size(); i++) {
if (i != 0)
//------------------------------------------------------------------------------
-QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt) {
+QString vvToolResample::GetVectorIntAsString(std::vector<int> vectorInt)
+{
QString result;
for (unsigned int i= 0; i<vectorInt.size(); i++) {
if (i != 0)
//------------------------------------------------------------------------------
-void vvToolResample::FillSizeEdit(std::vector<int> size) {
+void vvToolResample::FillSizeEdit(std::vector<int> size)
+{
xSizeLineEdit->setText(QString::number(size[0]));
ySizeLineEdit->setText(QString::number(size[1]));
if (size.size() > 2)
//------------------------------------------------------------------------------
-void vvToolResample::FillSpacingEdit(std::vector<double> spacing) {
+void vvToolResample::FillSpacingEdit(std::vector<double> spacing)
+{
xSpacingLineEdit->setText(QString::number(spacing[0]));
ySpacingLineEdit->setText(QString::number(spacing[1]));
if (spacing.size() > 2)
//------------------------------------------------------------------------------
-void vvToolResample::UpdateOutputSizeAndSpacing() {
+void vvToolResample::UpdateOutputSizeAndSpacing()
+{
mOutputSize.resize(mDimension);
mOutputSize = mInputSize;
mOutputSpacing.resize(mDimension);
//------------------------------------------------------------------------------
-void vvToolResample::UpdateControlSizeAndSpacing() {
+void vvToolResample::UpdateControlSizeAndSpacing()
+{
scaleSizeLineEdit->setText("");
scaleSpacingLineEdit->setText("");
isoSizeLineEdit->setText("");
ySizeLineEdit->setReadOnly(0);
if (mDimension > 2)
zSizeLineEdit->setReadOnly(0);
- }
- else {
+ } else {
if (spacingRadioButton->isChecked()) {
xSpacingLineEdit->setReadOnly(0);
ySpacingLineEdit->setReadOnly(0);
if (mDimension > 2)
zSpacingLineEdit->setReadOnly(0);
- }
- else if (scaleSizeRadioButton->isChecked())
+ } else if (scaleSizeRadioButton->isChecked())
scaleSizeLineEdit->setReadOnly(0);
else if (scaleSpacingRadioButton->isChecked())
scaleSpacingLineEdit->setReadOnly(0);
//------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSpacingFromSize() {
+void vvToolResample::ComputeNewSpacingFromSize()
+{
double newSpacing = mInputSpacing[0]*mInputSize[0];
xSpacingLineEdit->setText(QString::number(newSpacing/xSizeLineEdit->text().toDouble()));
newSpacing = mInputSpacing[1]*mInputSize[1];
ySpacingLineEdit->setText(QString::number(newSpacing/ySizeLineEdit->text().toDouble()));
- if (mDimension > 2)
- {
- newSpacing = mInputSpacing[2]*mInputSize[2];
- zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
- }
+ if (mDimension > 2) {
+ newSpacing = mInputSpacing[2]*mInputSize[2];
+ zSpacingLineEdit->setText(QString::number(newSpacing/zSizeLineEdit->text().toDouble()));
+ }
UpdateOutputSizeAndSpacing();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSizeFromSpacing() {
+void vvToolResample::ComputeNewSizeFromSpacing()
+{
double newSize = mInputSpacing[0]*mInputSize[0];
xSizeLineEdit->setText(QString::number(newSize/xSpacingLineEdit->text().toDouble()));
newSize = mInputSpacing[1]*mInputSize[1];
ySizeLineEdit->setText(QString::number(newSize/ySpacingLineEdit->text().toDouble()));
- if (mDimension > 2)
- {
- newSize = mInputSpacing[2]*mInputSize[2];
- zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
- }
+ if (mDimension > 2) {
+ newSize = mInputSpacing[2]*mInputSize[2];
+ zSizeLineEdit->setText(QString::number(newSize/zSpacingLineEdit->text().toDouble()));
+ }
UpdateOutputSizeAndSpacing();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSpacingFromScale() {
+void vvToolResample::ComputeNewSpacingFromScale()
+{
xSpacingLineEdit->setText(QString::number(mInputSpacing[0]*scaleSpacingLineEdit->text().toDouble()/100));
ySpacingLineEdit->setText(QString::number(mInputSpacing[1]*scaleSpacingLineEdit->text().toDouble()/100));
if (mDimension > 2)
//------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSizeFromScale() {
+void vvToolResample::ComputeNewSizeFromScale()
+{
xSizeLineEdit->setText(QString::number(mInputSize[0]*scaleSizeLineEdit->text().toDouble()/100));
ySizeLineEdit->setText(QString::number(mInputSize[1]*scaleSizeLineEdit->text().toDouble()/100));
if (mDimension > 2)
//------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSpacingFromIso() {
+void vvToolResample::ComputeNewSpacingFromIso()
+{
xSpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
ySpacingLineEdit->setText(QString::number(isoSpacingLineEdit->text().toDouble()));
if (mDimension > 2)
//------------------------------------------------------------------------------
-void vvToolResample::ComputeNewSizeFromIso() {
+void vvToolResample::ComputeNewSizeFromIso()
+{
xSizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
ySizeLineEdit->setText(QString::number(isoSizeLineEdit->text().toDouble()));
if (mDimension > 2)
//------------------------------------------------------------------------------
-void vvToolResample::UpdateInterpolation() {
+void vvToolResample::UpdateInterpolation()
+{
if (interpolationComboBox->currentText() == "BSpline") {
bSplineLabel->show();
bSplineOrderSpinBox->show();
bLUTFactorLabel->hide();
bLUTSpinBox->hide();
- }
- else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") {
+ } else if (interpolationComboBox->currentText() == "Blut (faster BSpline)") {
bSplineLabel->show();
bSplineOrderSpinBox->show();
bLUTFactorLabel->show();
bLUTSpinBox->show();
- }
- else {
+ } else {
bSplineLabel->hide();
bSplineOrderSpinBox->hide();
bLUTFactorLabel->hide();
//------------------------------------------------------------------------------
-void vvToolResample::UpdateGaussianFilter() {
+void vvToolResample::UpdateGaussianFilter()
+{
if (gaussianFilterCheckBox->isChecked()) {
gaussianFilterLabel->show();
xGaussianLineEdit->show();
yGaussianLineEdit->show();
if (mDimension > 2)
zGaussianLineEdit->show();
- }
- else {
+ } else {
gaussianFilterLabel->hide();
xGaussianLineEdit->hide();
yGaussianLineEdit->hide();
//------------------------------------------------------------------------------
-void vvToolResample::apply() {
+void vvToolResample::apply()
+{
// Get resampler options
std::vector<double> sigma;
if (mDimension > 2) sigma.push_back(zGaussianLineEdit->text().toDouble());
if (mDimension == 4) sigma.push_back(0.01); //FIXME Don't filter along the temporal direction
- mFilter->SetOutputSize(mOutputSize);
- mFilter->SetOutputSpacing(mOutputSpacing);
- mFilter->SetInterpolationName(interpolationComboBox->currentText().toLower().toStdString());
-
- if (interpolationComboBox->currentText() == "BSpline")
- mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
- else if (interpolationComboBox->currentText() == "B-LUT (faster BSpline)") {
- mFilter->SetInterpolationName("blut");
- mFilter->SetBSplineOrder(bSplineOrderSpinBox->value());
- mFilter->SetBLUTSampling(bLUTSpinBox->value());
+ // Build ArgsInfo
+ clitk::ResampleImageGenericFilter::ArgsInfoType mArgsInfo;
+
+ // Initialisation to default
+ cmdline_parser_clitkResampleImage_init(&mArgsInfo);
+ mArgsInfo.input_given = 0;
+ mArgsInfo.output_given = 0;
+
+ // Size and spacing options
+ mArgsInfo.size_given = mDimension;
+ mArgsInfo.spacing_given = mDimension;
+ mArgsInfo.size_arg = new int[mDimension];
+ mArgsInfo.spacing_arg = new float[mDimension];
+ for(int i=0; i<mDimension; i++) {
+ mArgsInfo.size_arg[i] = mOutputSize[i];
+ mArgsInfo.spacing_arg[i] = mOutputSpacing[i];
+ }
+
+ if (sizeRadioButton->isChecked() ||
+ scaleSizeRadioButton->isChecked() ||
+ isoSizeRadioButton->isChecked()) {
+ mArgsInfo.spacing_given=0;
+ }
+ if (spacingRadioButton->isChecked() ||
+ scaleSpacingRadioButton->isChecked() ||
+ isoSpacingRadioButton->isChecked()) {
+ mArgsInfo.size_given=0;
+ }
+
+ // Interpolation options
+ std::string interp = interpolationComboBox->currentText().toLower().toStdString();
+ if (interp == "nn") SetArgOptionString(mArgsInfo.interp, std::string("nn"));
+ if (interp == "linear") SetArgOptionString(mArgsInfo.interp, std::string("linear"));
+ if (interp == "bspline") SetArgOptionString(mArgsInfo.interp, std::string("bspline"));
+ if (interp == "blut (faster bspline)") SetArgOptionString(mArgsInfo.interp, std::string("blut"));
+ if (interp == "windowed sinc") SetArgOptionString(mArgsInfo.interp, std::string("windowed sinc"));
+
+ if (interp == "bspline") {
+ mArgsInfo.order_arg = bSplineOrderSpinBox->value();
}
- if (gaussianFilterCheckBox->isChecked())
- mFilter->SetGaussianSigma(sigma);
- // mFilter->SetOutputFileName(OutputFileName.toStdString());
- mFilter->SetDefaultPixelValue(defaultPixelValueLineEdit->text().toDouble());
+ else {
+ if (interp == "blut (faster bspline)") {
+ mArgsInfo.order_arg = bSplineOrderSpinBox->value();
+ mArgsInfo.sampling_arg = bLUTSpinBox->value();
+ }
+ }
+
+ // Gauss
+ if (gaussianFilterCheckBox->isChecked()) {
+ mArgsInfo.gauss_given = mDimension;
+ mArgsInfo.gauss_arg = new float[mDimension];
+ for(int i=0; i<mDimension; i++) {
+ mArgsInfo.gauss_arg[i] = sigma[i];
+ }
+ }
+ mArgsInfo.default_arg = defaultPixelValueLineEdit->text().toDouble();
+
+ // Thread
+ mArgsInfo.thread_arg = QThread::idealThreadCount();
+ mArgsInfo.thread_given = 1;
+
+ // Set options to filter
+ mFilter->SetArgsInfo(mArgsInfo);
mFilter->SetInputVVImage(mCurrentImage);
// Go !
mFilter->Update();
mOutput = mFilter->GetOutputVVImage();
+ mOutput->GetTransform()[0]->SetMatrix(mCurrentSlicerManager->GetSlicer(0)->GetConcatenatedTransform()->GetMatrix());
AddImage(mOutput,GetOutputFileName());
close();
}
//------------------------------------------------------------------------------
-std::string vvToolResample::GetOutputFileName() {
+std::string vvToolResample::GetOutputFileName()
+{
QFileInfo info(QString(mCurrentSlicerManager->GetFileName().c_str()));
return (info.path().toStdString() + "/resampled_" + info.fileName().toStdString());
}