Example #1
0
void mitk::RegionGrow3DTool::StartRegionGrowing(itk::Image<TPixel, VImageDimension>* itkImage, mitk::Geometry3D* imageGeometry, mitk::PointSet::PointType seedPoint)
{
    typedef itk::Image<TPixel, VImageDimension> InputImageType;
    typedef typename InputImageType::IndexType IndexType;
    typedef itk::ConnectedAdaptiveThresholdImageFilter<InputImageType, InputImageType> RegionGrowingFilterType;
    typename RegionGrowingFilterType::Pointer regionGrower = RegionGrowingFilterType::New();

    if ( !imageGeometry->IsInside(seedPoint) )
    {
        return;
    }

    IndexType seedIndex;
    imageGeometry->WorldToIndex( seedPoint, seedIndex);// convert world coordinates to image indices

    //int seedValue = itkImage->GetPixel(seedIndex);

    regionGrower->SetInput( itkImage );
    regionGrower->AddSeed( seedIndex );
    regionGrower->SetLower( m_LowerThreshold );
    regionGrower->SetUpper( m_UpperThreshold );
    regionGrower->SetGrowingDirectionIsUpwards( m_CurrentRGDirectionIsUpwards );

    try
    {
        regionGrower->Update();
    }
    catch( ... )
    {
        MITK_ERROR << "Something went wrong!"  << endl;
        return;
    }

    m_SeedpointValue = regionGrower->GetSeedpointValue();

    //initialize slider
    if(m_CurrentRGDirectionIsUpwards)
    {
        UpperThresholdValueChanged.Send(m_UpperThreshold);
        LowerThresholdValueChanged.Send(m_SeedpointValue);
    }
    else
    {
        UpperThresholdValueChanged.Send(m_SeedpointValue);
        LowerThresholdValueChanged.Send(m_LowerThreshold);
    }

    m_DetectedLeakagePoint = regionGrower->GetLeakagePoint();

    mitk::Image::Pointer resultImage = mitk::ImportItkImage(regionGrower->GetOutput())->Clone();

    m_FeedbackNode->SetData( resultImage );
    m_FeedbackNode->SetVisibility(true);

    InitializeLevelWindow();
}
void QmitkAdaptiveRegionGrowingToolGUI::StartRegionGrowing(itk::Image<TPixel, VImageDimension>* itkImage, mitk::BaseGeometry* imageGeometry, mitk::PointSet::PointType seedPoint)
{
  typedef itk::Image<TPixel, VImageDimension> InputImageType;
  typedef typename InputImageType::IndexType IndexType;
  typedef itk::ConnectedAdaptiveThresholdImageFilter<InputImageType, InputImageType> RegionGrowingFilterType;
  typename RegionGrowingFilterType::Pointer regionGrower = RegionGrowingFilterType::New();
  typedef itk::MinimumMaximumImageCalculator<InputImageType> MinMaxValueFilterType;

  if ( !imageGeometry->IsInside(seedPoint) )
  {
    QApplication::restoreOverrideCursor();//reset cursor to be able to click ok with the regular mouse cursor
    QMessageBox::information( NULL, "Segmentation functionality", "The seed point is outside of the image! Please choose a position inside the image!");
    return;
  }

  IndexType seedIndex;
  imageGeometry->WorldToIndex( seedPoint, seedIndex);// convert world coordinates to image indices



  if (m_SeedpointValue>m_UPPERTHRESHOLD || m_SeedpointValue<m_LOWERTHRESHOLD)
  {
    QApplication::restoreOverrideCursor();//reset cursor to be able to click ok with the regular mouse cursor
    QMessageBox::information( NULL, "Segmentation functionality", "The seed point is outside the defined thresholds! Please set a new seed point or adjust the thresholds.");
    MITK_INFO << "Mean: " <<m_SeedPointValueMean;
    return;
  }

  //Setting the direction of the regiongrowing. For dark structures e.g. the lung the regiongrowing
  //is performed starting at the upper value going to the lower one
  regionGrower->SetGrowingDirectionIsUpwards( m_CurrentRGDirectionIsUpwards );
  regionGrower->SetInput( itkImage );
  regionGrower->AddSeed( seedIndex );
  //In some cases we have to subtract 1 for the lower threshold and add 1 to the upper.
  //Otherwise no region growing is done. Maybe a bug in the ConnectiveAdaptiveThresholdFilter
  regionGrower->SetLower( m_LOWERTHRESHOLD-1 );
  regionGrower->SetUpper( m_UPPERTHRESHOLD+1);

  try
  {
    regionGrower->Update();
  }
    catch(itk::ExceptionObject &exc)
  {
    QMessageBox errorInfo;
    errorInfo.setWindowTitle("Adaptive RG Segmentation Functionality");
    errorInfo.setIcon(QMessageBox::Critical);
    errorInfo.setText("An error occurred during region growing!");
    errorInfo.setDetailedText(exc.what());
    errorInfo.exec();
    return; // can't work
  }
  catch( ... )
  {
    QMessageBox::critical( NULL, "Adaptive RG Segmentation Functionality", "An error occurred during region growing!");
    return;
  }

  mitk::Image::Pointer resultImage = mitk::ImportItkImage(regionGrower->GetOutput())->Clone();
  //initialize slider
  m_Controls.m_PreviewSlider->setMinimum(m_LOWERTHRESHOLD);
  mitk::ScalarType max = m_LOWERTHRESHOLD+resultImage->GetStatistics()->GetScalarValueMax();
  if (max < m_UPPERTHRESHOLD)
    m_Controls.m_PreviewSlider->setMaximum(max);
  else
    m_Controls.m_PreviewSlider->setMaximum(m_UPPERTHRESHOLD);

  this->m_DetectedLeakagePoint = regionGrower->GetLeakagePoint();

  if(m_CurrentRGDirectionIsUpwards)
  {
    m_Controls.m_PreviewSlider->setValue(m_SeedPointValueMean-1);
  }
  else
  {
    m_Controls.m_PreviewSlider->setValue(m_SeedPointValueMean+1);
  }
  this->m_SliderInitialized = true;

  //create new node and then delete the old one if there is one
  mitk::DataNode::Pointer newNode = mitk::DataNode::New();
  newNode->SetData( resultImage );

  // set some properties
  newNode->SetProperty("name", mitk::StringProperty::New(m_NAMEFORLABLEDSEGMENTATIONIMAGE));
  newNode->SetProperty("helper object", mitk::BoolProperty::New(true));
  newNode->SetProperty("color", mitk::ColorProperty::New(0.0,1.0,0.0));
  newNode->SetProperty("layer", mitk::IntProperty::New(1));
  newNode->SetProperty("opacity", mitk::FloatProperty::New(0.7));

  //delete the old image, if there was one:
  mitk::DataNode::Pointer binaryNode = m_DataStorage->GetNamedNode(m_NAMEFORLABLEDSEGMENTATIONIMAGE);
  m_DataStorage->Remove(binaryNode);

  // now add result to data tree
  m_DataStorage->Add( newNode, m_InputImageNode );

  this->InitializeLevelWindow();

  if(m_UseVolumeRendering)
    this->EnableVolumeRendering(true);

  m_UpdateSuggestedThreshold = true;// reset first stored threshold value
  //Setting progress to finished
  mitk::ProgressBar::GetInstance()->Progress(357);
  mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}