Public Member Functions | Static Public Attributes | Protected Slots | Protected Member Functions | Protected Attributes

QmitkRegionGrowingView Class Reference
[Functionalities]

QmitkRegionGrowingView. More...

#include <QmitkRegionGrowingView.h>

Inheritance diagram for QmitkRegionGrowingView:
Inheritance graph
[legend]
Collaboration diagram for QmitkRegionGrowingView:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 QmitkRegionGrowingView ()
virtual ~QmitkRegionGrowingView ()
virtual void CreateQtPartControl (QWidget *parent)
virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
virtual void StdMultiWidgetNotAvailable ()
virtual void Deactivated ()

Static Public Attributes

static const std::string VIEW_ID = "org.mitk.views.regiongrowing"

Protected Slots

void DoImageProcessing ()
 Called when the user clicks the GUI button.

Protected Member Functions

template<typename TPixel , unsigned int VImageDimension>
void ItkImageProcessing (itk::Image< TPixel, VImageDimension > *itkImage, mitk::Geometry3D *imageGeometry, mitk::DataNode *parent)
 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)
virtual void OnSelectionChanged (std::vector< mitk::DataNode * > nodes)
 called by QmitkFunctionality when DataManager's selection has changed

Protected Attributes

mitk::PointSet::Pointer m_PointSet
 This is the actual seed point data object.
Ui::QmitkRegionGrowingViewControlsm_Controls
QmitkStdMultiWidgetm_MultiWidget

Detailed Description

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!
See also:
QmitkFunctionality

Definition at line 45 of file QmitkRegionGrowingView.h.


Constructor & Destructor Documentation

QmitkRegionGrowingView::QmitkRegionGrowingView (  )

Definition at line 41 of file QmitkRegionGrowingView.cpp.

: QmitkFunctionality()
, m_Controls( 0 )
, m_MultiWidget( NULL )
{
}
QmitkRegionGrowingView::~QmitkRegionGrowingView (  ) [virtual]

Definition at line 48 of file QmitkRegionGrowingView.cpp.

{
}

Member Function Documentation

void QmitkRegionGrowingView::CreateQtPartControl ( QWidget *  parent ) [virtual]

Implements berry::QtViewPart.

Definition at line 57 of file QmitkRegionGrowingView.cpp.

References Ui_QmitkRegionGrowingViewControls::btnPerformImageProcessing, DoImageProcessing(), QmitkFunctionality::GetDefaultDataStorage(), Ui_QmitkRegionGrowingViewControls::lstPoints, m_Controls, m_MultiWidget, m_PointSet, mitk::IntProperty::New(), mitk::BoolProperty::New(), mitk::DataNode::New(), mitk::PointSet::New(), QmitkPointListWidget::SetMultiWidget(), QmitkPointListWidget::SetPointSetNode(), and Ui_QmitkRegionGrowingViewControls::setupUi().

{
  // 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::Deactivated (  ) [virtual]
void QmitkRegionGrowingView::DoImageProcessing (  ) [protected, slot]

Called when the user clicks the GUI button.

Definition at line 123 of file QmitkRegionGrowingView.cpp.

References AccessByItk_2, mitk::DataNode::GetData(), QmitkFunctionality::GetDataManagerSelection(), mitk::BaseData::GetGeometry(), mitk::DataNode::GetName(), ItkImageProcessing(), m_PointSet, and MITK_INFO.

Referenced by CreateQtPartControl().

{
  std::vector<mitk::DataNode*> 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<mitk::Image*>( 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

    }
  }
}
template<typename TPixel , unsigned int VImageDimension>
void QmitkRegionGrowingView::ItkImageProcessing ( itk::Image< TPixel, VImageDimension > *  itkImage,
mitk::Geometry3D imageGeometry,
mitk::DataNode parent 
) [protected]

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)

Definition at line 178 of file QmitkRegionGrowingView.cpp.

References QmitkFunctionality::GetDefaultDataStorage(), mitk::RenderingManager::GetInstance(), mitk::ImportItkImage(), mitk::Geometry3D::IsInside(), m_PointSet, QuadProgPP::max(), min, mitk::FloatProperty::New(), mitk::IntProperty::New(), mitk::ColorProperty::New(), mitk::StringProperty::New(), mitk::BoolProperty::New(), mitk::DataNode::New(), and mitk::Geometry3D::WorldToIndex().

Referenced by DoImageProcessing().

{
  typedef itk::Image< TPixel, VImageDimension > InputImageType;
  typedef typename InputImageType::IndexType    IndexType;
  
  // instantiate an ITK region growing filter, set its parameters
  typedef itk::ConnectedThresholdImageFilter<InputImageType, InputImageType> 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<TPixel>::max() );
  TPixel max( std::numeric_limits<TPixel>::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;

  // 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();
}
void QmitkRegionGrowingView::OnSelectionChanged ( std::vector< mitk::DataNode * >  nodes ) [protected, virtual]

called by QmitkFunctionality when DataManager's selection has changed

Reimplemented from QmitkFunctionality.

Definition at line 103 of file QmitkRegionGrowingView.cpp.

References Ui_QmitkRegionGrowingViewControls::lblWarning, and m_Controls.

{ 
  // iterate all selected objects, adjust warning visibility
  for( std::vector<mitk::DataNode*>::iterator it = nodes.begin();
       it != nodes.end();
       ++it )
  {
    mitk::DataNode::Pointer node = *it;
  
    if( node.IsNotNull() && dynamic_cast<mitk::Image*>(node->GetData()) )
    {
      m_Controls->lblWarning->setVisible( false );
      return;
    }
  }

  m_Controls->lblWarning->setVisible( true );
}
void QmitkRegionGrowingView::StdMultiWidgetAvailable ( QmitkStdMultiWidget stdMultiWidget ) [virtual]

Called when a StdMultiWidget is available. Should not be used anymore, see GetActiveStdMultiWidget()

See also:
GetActiveStdMultiWidget()

Reimplemented from QmitkFunctionality.

Definition at line 89 of file QmitkRegionGrowingView.cpp.

References Ui_QmitkRegionGrowingViewControls::lstPoints, m_Controls, m_MultiWidget, and QmitkPointListWidget::SetMultiWidget().

void QmitkRegionGrowingView::StdMultiWidgetNotAvailable (  ) [virtual]

Called when no StdMultiWidget is available anymore. Should not be used anymore, see GetActiveStdMultiWidget()

See also:
GetActiveStdMultiWidget()

Reimplemented from QmitkFunctionality.

Definition at line 96 of file QmitkRegionGrowingView.cpp.

References Ui_QmitkRegionGrowingViewControls::lstPoints, m_Controls, m_MultiWidget, and QmitkPointListWidget::SetMultiWidget().


Member Data Documentation

This is the actual seed point data object.

Definition at line 83 of file QmitkRegionGrowingView.h.

Referenced by CreateQtPartControl(), DoImageProcessing(), and ItkImageProcessing().

const std::string QmitkRegionGrowingView::VIEW_ID = "org.mitk.views.regiongrowing" [static]

Definition at line 53 of file QmitkRegionGrowingView.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines