Ejemplo n.º 1
0
ImageType::Pointer SBFilterUtils::RegionGrowing(ImageType::Pointer image, ImageType::IndexType seed, bool fullConnectivity, int lowerThreshold, int upperThreshold, int replaceValue) {
	
	ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();
	connectedThreshold->SetInput(image);
	connectedThreshold->SetSeed(seed);
	connectedThreshold->SetLower(lowerThreshold);
	connectedThreshold->SetUpper(upperThreshold);
	connectedThreshold->SetReplaceValue(replaceValue);
	if(fullConnectivity)
		connectedThreshold->SetConnectivity(ConnectedFilterType::FullConnectivity);
	connectedThreshold->Update();

	return connectedThreshold->GetOutput();
}
vtkImageData* ROISegmentation::startRegionGrow(){
	typedef itk::CastImageFilter< ImageType, ImageType >
		CastingFilterType;
	CastingFilterType::Pointer caster = CastingFilterType::New();
	typedef itk::CurvatureFlowImageFilter< ImageType, ImageType >
		CurvatureFlowImageFilterType;
	CurvatureFlowImageFilterType::Pointer smoothing =
		CurvatureFlowImageFilterType::New();
	typedef itk::ConfidenceConnectedImageFilter<ImageType, ImageType>
		ConnectedFilterType;
	ConnectedFilterType::Pointer confidenceConnected = ConnectedFilterType::New();
	smoothing->SetInput(pDCM->getITKRawImage());
	confidenceConnected->SetInput(smoothing->GetOutput());
	caster->SetInput(confidenceConnected->GetOutput());

	//Parameter Settings
	smoothing->SetNumberOfIterations(2);
	smoothing->SetTimeStep(0.05);
	confidenceConnected->SetMultiplier(2.5);
	confidenceConnected->SetNumberOfIterations(2);
	confidenceConnected->SetInitialNeighborhoodRadius(1);
	confidenceConnected->SetReplaceValue(255);
	if (!_index.empty()){
		ImageType::PointType seedPoint;
		ImageType::IndexType seedIndex;
		std::vector<CursorDim>::iterator iter = _index.begin();
		for (iter; iter != _index.end(); ++iter){
			seedPoint[0] = iter->_x;
			seedPoint[1] = iter->_y;
			seedPoint[2] = iter->_z;
			if (pDCM->getITKRawImage()->TransformPhysicalPointToIndex(seedPoint, seedIndex)){
				qDebug()<<"SeedIndex:    " << seedIndex[0] << "  " << seedIndex[1] << "  " << seedIndex[2] << endl;
				confidenceConnected->AddSeed(seedIndex);
			}
		}
		caster->Update();

		typedef itk::ImageToVTKImageFilter<ImageType>       ConnectorType;
		ConnectorType::Pointer connector = ConnectorType::New();
		connector->SetInput(caster->GetOutput());
		connector->Update();
		vtkImageData * rawImage = vtkImageData::New();
		rawImage->DeepCopy(connector->GetOutput());
		return rawImage;
	}
	else{
		return NULL;
	}
}