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;
	}
}
void ImageCurvatureFlowTransform::process()
    {
    foreach (const ElementBase *source, mSourceElementsReadySet)
        for (int i = 0; i < source->getFramesNo(); ++i)
            {
            const FrameBase *frame = source->getFrame(i);
            if (mSrcFrame.isCopyable(*frame))
                {
                mImageFrame.clear();
                mImageFrame.setSourceName(frame->getSourceName());
                mSrcFrame.resizeAndCopyFrame(*frame);
                FloatImageFrame::ImageType::Pointer srcImg = mSrcFrame;

                typedef FloatImageFrame::PixelType InternalPixelType;
                const unsigned int Dimension = 2;
                typedef Image<InternalPixelType, Dimension> InternalImageType;

//                 typedef GrayImageFrame::PixelType OutputPixelType;
//                 typedef Image<OutputPixelType, Dimension> OutputImageType;

                typedef CurvatureFlowImageFilter<InternalImageType, InternalImageType> CurvatureFlowImageFilterType;
                CurvatureFlowImageFilterType::Pointer curvatureflow = CurvatureFlowImageFilterType::New();

                curvatureflow->SetNumberOfIterations(property("iterations").toInt());
                curvatureflow->SetTimeStep(property("timeStep").toDouble());

                curvatureflow->SetInput(srcImg);
                curvatureflow->Update();
                mImageFrame.resizeAndCopyImage(curvatureflow->GetOutput());

                emit framesReady();
                break;
                }
            }
    }