/*========================================================================= medInria Copyright (c) INRIA 2013 - 2018. All rights reserved. See LICENSE.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. =========================================================================*/ #include #include #include #include #include #include #include #include #include medItkErodeImageProcess::medItkErodeImageProcess(QObject *parent) : medAbstractErodeImageProcess(parent) { m_filter = nullptr; } medItkErodeImageProcess::~medItkErodeImageProcess() { } QString medItkErodeImageProcess::caption() const { return "Image erosion (ITK)"; } QString medItkErodeImageProcess::description() const { return "Use ITK GrayscaleErodeImageFilter to perform an erosion on an image."; } medAbstractJob::medJobExitStatus medItkErodeImageProcess::run() { medAbstractJob::medJobExitStatus jobExitSatus = medAbstractJob::MED_JOB_EXIT_FAILURE; if(this->input()) { QString id = this->input()->identifier(); if ( id == "itkDataImageChar3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageUChar3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageShort3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageUShort3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageInt3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageUInt3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageLong3" ) { jobExitSatus = this->_run(); } else if ( id== "itkDataImageULong3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageFloat3" ) { jobExitSatus = this->_run(); } else if ( id == "itkDataImageDouble3" ) { jobExitSatus = this->_run(); } } return jobExitSatus; } template medAbstractJob::medJobExitStatus medItkErodeImageProcess::_run() { typedef itk::Image ImageType; typename ImageType::Pointer in = dynamic_cast((itk::Object*)(this->input()->data())); if(in.IsNotNull()) { typedef itk::BinaryBallStructuringElement KernelType; typedef itk::GrayscaleErodeImageFilter FilterType; typename FilterType::Pointer filter = FilterType::New(); m_filter = filter; KernelType kernel; kernel.SetRadius(this->kernelRadius()->value()); kernel.CreateStructuringElement(); filter->SetKernel(kernel); filter->SetInput(in); itk::CStyleCommand::Pointer callback = itk::CStyleCommand::New(); callback->SetClientData((void*)this); callback->SetCallback(medItkErodeImageProcess::eventCallback); filter->AddObserver(itk::ProgressEvent(), callback); try { filter->Update(); } catch(itk::ProcessAborted &) { return medAbstractJob::MED_JOB_EXIT_CANCELLED; } medAbstractImageData *out= dynamic_cast(medAbstractDataFactory::instance()->create(this->input()->identifier())); out->setData(filter->GetOutput()); this->setOutput(out); return medAbstractJob::MED_JOB_EXIT_SUCCESS; } return medAbstractJob::MED_JOB_EXIT_FAILURE; } void medItkErodeImageProcess::cancel() { if(this->isRunning() && m_filter.IsNotNull()) { m_filter->AbortGenerateDataOn(); } }