diff --git a/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.cpp b/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.cpp index 7565d7acce..2b1b76d60c 100644 --- a/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.cpp @@ -1,251 +1,251 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision: 17495 $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ // Blueberry #include #include // MITK #include "mitkImageAccessByItk.h" #include "mitkITKImageImport.h" #include "mitkProperties.h" #include "mitkColorProperty.h" // Qmitk #include "QmitkRegionGrowingView.h" #include "QmitkPointListWidget.h" #include "QmitkStdMultiWidget.h" // Qt #include // ITK #include const std::string QmitkRegionGrowingView::VIEW_ID = "org.mitk.views.regiongrowing"; QmitkRegionGrowingView::QmitkRegionGrowingView() : QmitkFunctionality() , m_Controls( 0 ) , m_MultiWidget( NULL ) { } QmitkRegionGrowingView::QmitkRegionGrowingView(const QmitkRegionGrowingView& other) { Q_UNUSED(other) throw std::runtime_error("Copy constructor not implemented"); } QmitkRegionGrowingView::~QmitkRegionGrowingView() { } void QmitkRegionGrowingView::Deactivated() { m_Controls->lstPoints->DeactivateInteractor(true); } void QmitkRegionGrowingView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkRegionGrowingViewControls; m_Controls->setupUi( parent ); connect( m_Controls->btnPerformImageProcessing, SIGNAL(clicked()), this, SLOT(DoImageProcessing()) ); // let the point set widget know about the multi widget (crosshair updates) m_Controls->lstPoints->SetMultiWidget( m_MultiWidget ); // create a new DataNode containing a PointSet with some interaction m_PointSet = mitk::PointSet::New(); mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New(); pointSetNode->SetData( m_PointSet ); pointSetNode->SetName("seed points for region growing"); pointSetNode->SetProperty("helper object", mitk::BoolProperty::New(true) ); pointSetNode->SetProperty("layer", mitk::IntProperty::New(1024) ); // add the pointset to the data tree (for rendering and access by other modules) GetDefaultDataStorage()->Add( pointSetNode ); // tell the GUI widget about out point set m_Controls->lstPoints->SetPointSetNode( pointSetNode ); } } void QmitkRegionGrowingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) { m_MultiWidget = &stdMultiWidget; m_Controls->lstPoints->SetMultiWidget( m_MultiWidget ); } void QmitkRegionGrowingView::StdMultiWidgetNotAvailable() { m_MultiWidget = NULL; m_Controls->lstPoints->SetMultiWidget( NULL ); } void QmitkRegionGrowingView::OnSelectionChanged( std::vector nodes ) { // iterate all selected objects, adjust warning visibility for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) { mitk::DataNode::Pointer node = *it; if( node.IsNotNull() && dynamic_cast(node->GetData()) ) { m_Controls->lblWarning->setVisible( false ); return; } } m_Controls->lblWarning->setVisible( true ); } void QmitkRegionGrowingView::DoImageProcessing() { std::vector nodes = this->GetDataManagerSelection(); if (nodes.empty()) return; mitk::DataNode* node = nodes.front(); if (!node) { // Nothing selected. Inform the user and return QMessageBox::information( NULL, "Region growing functionality", "Please load and select an image before region growing."); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData* data = node->GetData(); if (data) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image* image = dynamic_cast( data ); if (image) { std::stringstream message; std::string name; message << "Performing image processing for image "; if (node->GetName(name)) { // a property called "name" was found for this DataNode message << "'" << name << "'"; } message << "."; MITK_INFO << message.str(); // So we have an image. Let's see if the user has set some seed points already if ( m_PointSet->GetSize() == 0 ) { // no points there. Not good for region growing QMessageBox::information( NULL, "Region growing functionality", "Please set some seed points inside the image first.\n" "(hold Shift key and click left mouse button inside the image.)" ); return; } // actually perform region growing. Here we have both an image and some seed points - AccessByItk_2( image, ItkImageProcessing, image->GetGeometry(), node ); // some magic to call the correctly templated function + AccessByItk_n( image, ItkImageProcessing, ( image->GetGeometry(), node, m_Controls->sliderOffsetValue->value() ) ); // some magic to call the correctly templated function } } } template < typename TPixel, unsigned int VImageDimension > -void QmitkRegionGrowingView::ItkImageProcessing( itk::Image< TPixel, VImageDimension >* itkImage, mitk::Geometry3D* imageGeometry, mitk::DataNode* parent ) +void QmitkRegionGrowingView::ItkImageProcessing( itk::Image< TPixel, VImageDimension >* itkImage, mitk::Geometry3D* imageGeometry, mitk::DataNode* parent, int thresholdOffset ) { typedef itk::Image< TPixel, VImageDimension > InputImageType; typedef typename InputImageType::IndexType IndexType; // instantiate an ITK region growing filter, set its parameters typedef itk::ConnectedThresholdImageFilter RegionGrowingFilterType; typename RegionGrowingFilterType::Pointer regionGrower = RegionGrowingFilterType::New(); regionGrower->SetInput( itkImage ); // don't forget this // determine a thresholding interval IndexType seedIndex; TPixel min( std::numeric_limits::max() ); TPixel max( std::numeric_limits::min() ); mitk::PointSet::PointsContainer* points = m_PointSet->GetPointSet()->GetPoints(); for ( mitk::PointSet::PointsConstIterator pointsIterator = points->Begin(); pointsIterator != points->End(); ++pointsIterator ) { // first test if this point is inside the image at all if ( !imageGeometry->IsInside( pointsIterator.Value()) ) { continue; } // convert world coordinates to image indices imageGeometry->WorldToIndex( pointsIterator.Value(), seedIndex); // get the pixel value at this point TPixel currentPixelValue = itkImage->GetPixel( seedIndex ); // adjust minimum and maximum values if (currentPixelValue > max) max = currentPixelValue; if (currentPixelValue < min) min = currentPixelValue; regionGrower->AddSeed( seedIndex ); } std::cout << "Values between " << min << " and " << max << std::endl; - min -= 30; - max += 30; + + min -= thresholdOffset; + max += thresholdOffset; // set thresholds and execute filter regionGrower->SetLower( min ); regionGrower->SetUpper( max ); regionGrower->Update(); mitk::Image::Pointer resultImage = mitk::ImportItkImage( regionGrower->GetOutput() ); mitk::DataNode::Pointer newNode = mitk::DataNode::New(); newNode->SetData( resultImage ); // set some properties newNode->SetProperty("binary", mitk::BoolProperty::New(true)); newNode->SetProperty("name", mitk::StringProperty::New("dumb segmentation")); newNode->SetProperty("color", mitk::ColorProperty::New(1.0,0.0,0.0)); newNode->SetProperty("volumerendering", mitk::BoolProperty::New(false)); newNode->SetProperty("layer", mitk::IntProperty::New(1)); newNode->SetProperty("opacity", mitk::FloatProperty::New(0.5)); // add result to data tree this->GetDefaultDataStorage()->Add( newNode, parent ); mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } - diff --git a/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.h b/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.h index fe217d8707..47e550a2d4 100644 --- a/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.h +++ b/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingView.h @@ -1,94 +1,94 @@ /*========================================================================= Program: Medical Imaging & Interaction Toolkit Language: C++ Date: $Date$ Version: $Revision: 17495 $ Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef QmitkRegionGrowingView_h #define QmitkRegionGrowingView_h #include #include #include "mitkPointSet.h" #include #include "ui_QmitkRegionGrowingViewControls.h" /*! \brief QmitkRegionGrowingView Functionality for demonstration of MITK basics. This functionality allows the user to set some seed points that are used for a simple region growing algorithm from ITK. \warning This is only for demonstration, it is NOT meant to be useful! \sa QmitkFunctionality \ingroup Functionalities */ class QmitkRegionGrowingView : public QmitkFunctionality { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; QmitkRegionGrowingView(); QmitkRegionGrowingView(const QmitkRegionGrowingView& other); virtual ~QmitkRegionGrowingView(); virtual void CreateQtPartControl(QWidget *parent); virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget); virtual void StdMultiWidgetNotAvailable(); virtual void Deactivated(); protected slots: /// \brief Called when the user clicks the GUI button void DoImageProcessing(); protected: /*! \brief ITK image processing function This function is templated like an ITK image. The MITK-Macro AccessByItk determines the actual pixel type and dimensionality of a given MITK image and calls this function for further processing (in our case region growing) */ template < typename TPixel, unsigned int VImageDimension > - void ItkImageProcessing( itk::Image< TPixel, VImageDimension >* itkImage, mitk::Geometry3D* imageGeometry, mitk::DataNode* parent ); + void ItkImageProcessing( itk::Image< TPixel, VImageDimension >* itkImage, mitk::Geometry3D* imageGeometry, mitk::DataNode* parent, int thresholdOffset ); /// \brief called by QmitkFunctionality when DataManager's selection has changed virtual void OnSelectionChanged( std::vector nodes ); /// \brief This is the actual seed point data object mitk::PointSet::Pointer m_PointSet; Ui::QmitkRegionGrowingViewControls* m_Controls; QmitkStdMultiWidget* m_MultiWidget; }; #endif // _QMITKREGIONGROWINGVIEW_H_INCLUDED diff --git a/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingViewControls.ui b/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingViewControls.ui index d242b149cd..4731ad4bb3 100644 --- a/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingViewControls.ui +++ b/Modules/Bundles/org.mitk.gui.qt.regiongrowing/src/internal/QmitkRegionGrowingViewControls.ui @@ -1,77 +1,150 @@ QmitkRegionGrowingViewControls 0 0 449 541 0 0 QmitkRegionGrowingView QLabel { color: rgb(255, 0, 0) } Please select an image! - + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + + + 60 + + + 30 + + + Qt::Horizontal + + + + + + + 60 + + + 30 + + + + Do image processing Start region grower - + Qt::Vertical QSizePolicy::Expanding 20 - 220 + 50 QmitkPointListWidget QListView
QmitkPointListWidget.h
QmitkDataStorageComboBox.h - + + + sliderOffsetValue + valueChanged(int) + offsetValueSpinBox + setValue(int) + + + 290 + 263 + + + 414 + 272 + + + + + offsetValueSpinBox + valueChanged(int) + sliderOffsetValue + setValue(int) + + + 410 + 260 + + + 258 + 265 + + + +