diff --git a/Modules/Segmentation/Interactions/mitkGrowCutTool.cpp b/Modules/Segmentation/Interactions/mitkGrowCutTool.cpp index 71c0308c72..370f93641e 100644 --- a/Modules/Segmentation/Interactions/mitkGrowCutTool.cpp +++ b/Modules/Segmentation/Interactions/mitkGrowCutTool.cpp @@ -1,153 +1,147 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkGrowCutTool.h" #include "mitkToolManager.h" #include "mitkImageCast.h" #include "mitkTool.h" #include #include #include "mitkGrowCutSegmentationFilter.h" // us #include #include #include #include // ITK #include namespace mitk { MITK_TOOL_MACRO(MITKSEGMENTATION_EXPORT, GrowCutTool, "GrowCutTool"); } mitk::GrowCutTool::GrowCutTool() : SegWithPreviewTool(true, "PressMoveReleaseAndPointSetting") { this->ResetsToEmptyPreviewOn(); this->UseSpecialPreviewColorOff(); } mitk::GrowCutTool::~GrowCutTool() {} bool mitk::GrowCutTool::CanHandle(const BaseData *referenceData, const BaseData *workingData) const { if (!Superclass::CanHandle(referenceData, workingData)) return false; auto *image = dynamic_cast(referenceData); if (image == nullptr) return false; return true; } const char **mitk::GrowCutTool::GetXPM() const { return nullptr; } const char *mitk::GrowCutTool::GetName() const { return "GrowCut"; } us::ModuleResource mitk::GrowCutTool::GetIconResource() const { us::Module *module = us::GetModuleContext()->GetModule(); us::ModuleResource resource = module->GetResource("GrowCut.svg"); return resource; } void mitk::GrowCutTool::Activated() { Superclass::Activated(); m_DistancePenalty = 0.0; } void mitk::GrowCutTool::Deactivated() { Superclass::Deactivated(); } -bool mitk::GrowCutTool::HasMoreThanTwoSeedLabel() +bool mitk::GrowCutTool::SeedImageIsValid() { if (nullptr == this->GetToolManager()->GetWorkingData(0)) { return false; } auto *workingDataLabelSetImage = dynamic_cast(this->GetToolManager()->GetWorkingData(0)->GetData()); if (nullptr == workingDataLabelSetImage) { return false; } - if (workingDataLabelSetImage->GetNumberOfLayers()>1) - { - return false; - } - - workingDataLabelSetImage->SetActiveLayer(0); - auto numberOfLabels = workingDataLabelSetImage->GetNumberOfLabels(); + auto numberOfLabels = workingDataLabelSetImage->GetNumberOfLabels(workingDataLabelSetImage->GetActiveLayer()); if (numberOfLabels >= 3) { return true; } return false; } void mitk::GrowCutTool::DoUpdatePreview(const Image *inputAtTimeStep, const Image * oldSegAtTimeStep, LabelSetImage *previewImage, TimeStepType timeStep) { if (nullptr != inputAtTimeStep && nullptr != previewImage) { mitk::GrowCutSegmentationFilter::Pointer growCutFilter = mitk::GrowCutSegmentationFilter::New(); if (nullptr == this->GetToolManager()->GetWorkingData(0)) { return; } SeedImageType::Pointer seedImage = SeedImageType::New(); CastToItkImage(oldSegAtTimeStep, seedImage); growCutFilter->SetSeedImage(seedImage); growCutFilter->SetDistancePenalty(m_DistancePenalty); growCutFilter->SetInput(inputAtTimeStep); growCutFilter->AddObserver(itk::ProgressEvent(), m_ProgressCommand); try { growCutFilter->Update(); } catch (...) { mitkThrow() << "itkGrowCutFilter error"; } auto growCutResultImage = mitk::LabelSetImage::New(); growCutResultImage->InitializeByLabeledImage(growCutFilter->GetOutput()); TransferLabelSetImageContent(growCutResultImage, previewImage, timeStep); } } diff --git a/Modules/Segmentation/Interactions/mitkGrowCutTool.h b/Modules/Segmentation/Interactions/mitkGrowCutTool.h index 4860df13a2..691dd053e3 100644 --- a/Modules/Segmentation/Interactions/mitkGrowCutTool.h +++ b/Modules/Segmentation/Interactions/mitkGrowCutTool.h @@ -1,64 +1,64 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef mitkGrowCutTool_h_Included #define mitkGrowCutTool_h_Included #include "mitkSegWithPreviewTool.h" #include namespace us { class ModuleResource; } namespace mitk { class MITKSEGMENTATION_EXPORT GrowCutTool : public SegWithPreviewTool { public: mitkClassMacro(GrowCutTool, SegWithPreviewTool); itkFactorylessNewMacro(Self); itkCloneMacro(Self); itkSetMacro(DistancePenalty, double); itkGetConstMacro(DistancePenalty, double); typedef itk::Image SeedImageType; typedef typename SeedImageType::IndexType IndexType; const char **GetXPM() const override; const char *GetName() const override; us::ModuleResource GetIconResource() const override; bool CanHandle(const BaseData *referenceData, const BaseData *workingData) const override; void Activated() override; void Deactivated() override; - bool HasMoreThanTwoSeedLabel(); + bool SeedImageIsValid(); protected: GrowCutTool(); // purposely hidden ~GrowCutTool() override; void DoUpdatePreview(const Image *inputAtTimeStep, const Image *oldSegAtTimeStep, LabelSetImage *previewImage, TimeStepType timeStep) override; double m_DistancePenalty = 0.0; }; } // namespace mitk #endif diff --git a/Modules/SegmentationUI/Qmitk/QmitkGrowCutToolGUI.cpp b/Modules/SegmentationUI/Qmitk/QmitkGrowCutToolGUI.cpp index b4ca6da252..03a607b838 100644 --- a/Modules/SegmentationUI/Qmitk/QmitkGrowCutToolGUI.cpp +++ b/Modules/SegmentationUI/Qmitk/QmitkGrowCutToolGUI.cpp @@ -1,149 +1,149 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkGrowCutToolGUI.h" #include #include // Qt #include #include #include #include #include #include MITK_TOOL_GUI_MACRO(MITKSEGMENTATIONUI_EXPORT, QmitkGrowCutToolGUI, "") QmitkGrowCutToolGUI::QmitkGrowCutToolGUI() : QmitkMultiLabelSegWithPreviewToolGUIBase() { auto enableConfirmSegBtnFnc = [this](bool enabled) { return enabled && m_FirstPreviewComputation; }; m_EnableConfirmSegBtnFnc = enableConfirmSegBtnFnc; } QmitkGrowCutToolGUI::~QmitkGrowCutToolGUI() {} void QmitkGrowCutToolGUI::ConnectNewTool(mitk::SegWithPreviewTool *newTool) { Superclass::ConnectNewTool(newTool); newTool->IsTimePointChangeAwareOff(); } void QmitkGrowCutToolGUI::InitializeUI(QBoxLayout *mainLayout) { m_Controls.setupUi(this); this->OnAdvancedSettingsButtonToggled(false); std::function isPreviewAvailable; isPreviewAvailable = [this]() { auto tool = this->GetConnectedToolAs(); if (nullptr != tool) { - return tool->HasMoreThanTwoSeedLabel(); + return tool->SeedImageIsValid(); } return false; }; auto previewAvailable = isPreviewAvailable(); m_Controls.m_previewButton->setEnabled(previewAvailable); m_Controls.m_warningLabel->setVisible(!previewAvailable); mainLayout->addLayout(m_Controls.verticalLayout); connect(m_Controls.m_previewButton, &QPushButton::clicked, this, &QmitkGrowCutToolGUI::OnPreviewBtnClicked); connect(m_Controls.m_advancedSettingsButton, &ctkExpandButton::toggled, this, &QmitkGrowCutToolGUI::OnAdvancedSettingsButtonToggled); connect(m_Controls.m_distancePenaltyDoubleSpinBox, qOverload(&QDoubleSpinBox::valueChanged), this, &QmitkGrowCutToolGUI::SetValueOfDistancePenaltySlider); connect(m_Controls.m_distancePenaltySlider, &QSlider::valueChanged, this, &QmitkGrowCutToolGUI::SetValueOfDistancePenaltyDoubleSpinBox); Superclass::InitializeUI(mainLayout); } void QmitkGrowCutToolGUI::SetValueOfDistancePenaltySlider(double val) { m_Controls.m_distancePenaltySlider->setValue(val * 100); } void QmitkGrowCutToolGUI::SetValueOfDistancePenaltyDoubleSpinBox(int val) { m_Controls.m_distancePenaltyDoubleSpinBox->setValue((static_cast(val) / 100)); } void QmitkGrowCutToolGUI::OnAdvancedSettingsButtonToggled(bool toggled) { m_Controls.m_distancePenaltyLabel->setVisible(toggled); m_Controls.m_distancePenaltyDoubleSpinBox->setVisible(toggled); m_Controls.m_distancePenaltySlider->setVisible(toggled); double distancePenaltyMinium = 0.0; double distancePenaltyMaximum = 1.0; m_Controls.m_distancePenaltyDoubleSpinBox->setMinimum(distancePenaltyMinium); m_Controls.m_distancePenaltyDoubleSpinBox->setMaximum(distancePenaltyMaximum); m_Controls.m_distancePenaltySlider->setMinimum(distancePenaltyMinium); m_Controls.m_distancePenaltySlider->setMaximum(distancePenaltyMaximum * 100); m_Controls.m_distancePenaltyDoubleSpinBox->setSingleStep(0.01); } void QmitkGrowCutToolGUI::OnPreviewBtnClicked() { auto tool = this->GetConnectedToolAs(); if (nullptr != tool) { try { tool->SetDistancePenalty(m_Controls.m_distancePenaltyDoubleSpinBox->value()); tool->UpdatePreview(); } catch (...) { this->setCursor(Qt::ArrowCursor); QMessageBox *messageBox = new QMessageBox(QMessageBox::Critical, nullptr, "itkGrowCutFilter error."); messageBox->exec(); delete messageBox; return; } m_FirstPreviewComputation = true; this->SetLabelSetPreview(tool->GetPreviewSegmentation()); tool->IsTimePointChangeAwareOn(); this->ActualizePreviewLabelVisibility(); } } void QmitkGrowCutToolGUI::EnableWidgets(bool enabled) { Superclass::EnableWidgets(enabled); m_Controls.m_distancePenaltyLabel->setEnabled(enabled); m_Controls.m_distancePenaltyDoubleSpinBox->setEnabled(enabled); m_Controls.m_distancePenaltySlider->setEnabled(enabled); }