Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <berryISelectionService.h>
00020 #include <berryIWorkbenchWindow.h>
00021
00022
00023 #include "mitkImageAccessByItk.h"
00024 #include "mitkITKImageImport.h"
00025 #include "mitkProperties.h"
00026 #include "mitkColorProperty.h"
00027
00028
00029 #include "QmitkRegionGrowingView.h"
00030 #include "QmitkPointListWidget.h"
00031 #include "QmitkStdMultiWidget.h"
00032
00033
00034 #include <QMessageBox>
00035
00036
00037 #include <itkConnectedThresholdImageFilter.h>
00038
00039 const std::string QmitkRegionGrowingView::VIEW_ID = "org.mitk.views.regiongrowing";
00040
00041 QmitkRegionGrowingView::QmitkRegionGrowingView()
00042 : QmitkFunctionality()
00043 , m_Controls( 0 )
00044 , m_MultiWidget( NULL )
00045 {
00046 }
00047
00048 QmitkRegionGrowingView::~QmitkRegionGrowingView()
00049 {
00050 }
00051
00052 void QmitkRegionGrowingView::Deactivated()
00053 {
00054 m_Controls->lstPoints->DeactivateInteractor(true);
00055 }
00056
00057 void QmitkRegionGrowingView::CreateQtPartControl( QWidget *parent )
00058 {
00059
00060 if ( !m_Controls )
00061 {
00062
00063 m_Controls = new Ui::QmitkRegionGrowingViewControls;
00064 m_Controls->setupUi( parent );
00065
00066 connect( m_Controls->btnPerformImageProcessing, SIGNAL(clicked()), this, SLOT(DoImageProcessing()) );
00067
00068
00069 m_Controls->lstPoints->SetMultiWidget( m_MultiWidget );
00070
00071
00072 m_PointSet = mitk::PointSet::New();
00073
00074 mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New();
00075 pointSetNode->SetData( m_PointSet );
00076 pointSetNode->SetName("seed points for region growing");
00077 pointSetNode->SetProperty("helper object", mitk::BoolProperty::New(true) );
00078 pointSetNode->SetProperty("layer", mitk::IntProperty::New(1024) );
00079
00080
00081 GetDefaultDataStorage()->Add( pointSetNode );
00082
00083
00084 m_Controls->lstPoints->SetPointSetNode( pointSetNode );
00085 }
00086 }
00087
00088
00089 void QmitkRegionGrowingView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget)
00090 {
00091 m_MultiWidget = &stdMultiWidget;
00092 m_Controls->lstPoints->SetMultiWidget( m_MultiWidget );
00093 }
00094
00095
00096 void QmitkRegionGrowingView::StdMultiWidgetNotAvailable()
00097 {
00098 m_MultiWidget = NULL;
00099 m_Controls->lstPoints->SetMultiWidget( NULL );
00100 }
00101
00102
00103 void QmitkRegionGrowingView::OnSelectionChanged( std::vector<mitk::DataNode*> nodes )
00104 {
00105
00106 for( std::vector<mitk::DataNode*>::iterator it = nodes.begin();
00107 it != nodes.end();
00108 ++it )
00109 {
00110 mitk::DataNode::Pointer node = *it;
00111
00112 if( node.IsNotNull() && dynamic_cast<mitk::Image*>(node->GetData()) )
00113 {
00114 m_Controls->lblWarning->setVisible( false );
00115 return;
00116 }
00117 }
00118
00119 m_Controls->lblWarning->setVisible( true );
00120 }
00121
00122
00123 void QmitkRegionGrowingView::DoImageProcessing()
00124 {
00125 std::vector<mitk::DataNode*> nodes = this->GetDataManagerSelection();
00126 if (nodes.empty()) return;
00127
00128 mitk::DataNode* node = nodes.front();
00129
00130 if (!node)
00131 {
00132
00133 QMessageBox::information( NULL, "Region growing functionality", "Please load and select an image before region growing.");
00134 return;
00135 }
00136
00137
00138
00139
00140 mitk::BaseData* data = node->GetData();
00141 if (data)
00142 {
00143
00144 mitk::Image* image = dynamic_cast<mitk::Image*>( data );
00145 if (image)
00146 {
00147 std::stringstream message;
00148 std::string name;
00149 message << "Performing image processing for image ";
00150 if (node->GetName(name))
00151 {
00152
00153 message << "'" << name << "'";
00154 }
00155 message << ".";
00156 MITK_INFO << message.str();
00157
00158
00159 if ( m_PointSet->GetSize() == 0 )
00160 {
00161
00162 QMessageBox::information( NULL, "Region growing functionality",
00163 "Please set some seed points inside the image first.\n"
00164 "(hold Shift key and click left mouse button inside the image.)"
00165 );
00166 return;
00167 }
00168
00169
00170 AccessByItk_2( image, ItkImageProcessing, image->GetGeometry(), node );
00171
00172 }
00173 }
00174 }
00175
00176
00177 template < typename TPixel, unsigned int VImageDimension >
00178 void QmitkRegionGrowingView::ItkImageProcessing( itk::Image< TPixel, VImageDimension >* itkImage, mitk::Geometry3D* imageGeometry, mitk::DataNode* parent )
00179 {
00180 typedef itk::Image< TPixel, VImageDimension > InputImageType;
00181 typedef typename InputImageType::IndexType IndexType;
00182
00183
00184 typedef itk::ConnectedThresholdImageFilter<InputImageType, InputImageType> RegionGrowingFilterType;
00185 typename RegionGrowingFilterType::Pointer regionGrower = RegionGrowingFilterType::New();
00186 regionGrower->SetInput( itkImage );
00187
00188
00189 IndexType seedIndex;
00190 TPixel min( std::numeric_limits<TPixel>::max() );
00191 TPixel max( std::numeric_limits<TPixel>::min() );
00192 mitk::PointSet::PointsContainer* points = m_PointSet->GetPointSet()->GetPoints();
00193 for ( mitk::PointSet::PointsConstIterator pointsIterator = points->Begin();
00194 pointsIterator != points->End();
00195 ++pointsIterator )
00196 {
00197
00198 if ( !imageGeometry->IsInside( pointsIterator.Value()) )
00199 {
00200 continue;
00201 }
00202
00203
00204 imageGeometry->WorldToIndex( pointsIterator.Value(), seedIndex);
00205
00206
00207 TPixel currentPixelValue = itkImage->GetPixel( seedIndex );
00208
00209
00210 if (currentPixelValue > max)
00211 max = currentPixelValue;
00212
00213 if (currentPixelValue < min)
00214 min = currentPixelValue;
00215
00216 regionGrower->AddSeed( seedIndex );
00217 }
00218
00219 std::cout << "Values between " << min << " and " << max << std::endl;
00220
00221 min -= 30;
00222 max += 30;
00223
00224
00225 regionGrower->SetLower( min );
00226 regionGrower->SetUpper( max );
00227
00228 regionGrower->Update();
00229
00230 mitk::Image::Pointer resultImage = mitk::ImportItkImage( regionGrower->GetOutput() );
00231 mitk::DataNode::Pointer newNode = mitk::DataNode::New();
00232 newNode->SetData( resultImage );
00233
00234
00235 newNode->SetProperty("binary", mitk::BoolProperty::New(true));
00236 newNode->SetProperty("name", mitk::StringProperty::New("dumb segmentation"));
00237 newNode->SetProperty("color", mitk::ColorProperty::New(1.0,0.0,0.0));
00238 newNode->SetProperty("volumerendering", mitk::BoolProperty::New(false));
00239 newNode->SetProperty("layer", mitk::IntProperty::New(1));
00240 newNode->SetProperty("opacity", mitk::FloatProperty::New(0.5));
00241
00242
00243 this->GetDefaultDataStorage()->Add( newNode, parent );
00244 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00245 }
00246