+// -------------------------------------------------------------------------
+template< class _TInput, class _TLabels, class _TFastRW >
+void CTBronchi::Process::
+_FastRW( _TInput& input, _TLabels& labels, _TFastRW& fastrw )
+{
+ TString iname = std::get< 0 >( this->m_StrArgs[ "fastrw" ] );
+ double t = fastrw.Load( iname );
+ if( t < 0 )
+ {
+ t = 0;
+
+ // Prepare weight functor
+ typedef fpa::Functors::Dijkstra::Image::Gaussian< typename _TInput::TImage, typename _TFastRW::TImage::PixelType > TWeight;
+ typename TWeight::Pointer weight = TWeight::New( );
+ weight->SetBeta( std::get< 0 >( this->m_DblArgs[ "beta" ] ) );
+ weight->SetEpsilon( std::get< 0 >( this->m_DblArgs[ "epsilon" ] ) );
+
+ // Random walk
+ typedef CTBronchi::Filter< fpa::Filters::Image::RandomWalker< typename _TInput::TImage, typename _TLabels::TImage, typename _TFastRW::TImage::PixelType > > TFilter;
+ TFilter filter;
+ filter.Get( )->SetInputImage( input.Get( ) );
+ filter.Get( )->SetInputLabels( labels.Get( ) );
+ filter.Get( )->SetWeightFunction( weight );
+ double t1 = filter.Update( );
+ t += t1;
+ std::cout << "Fast random walker executed in " << t1 << " s" << std::endl;
+
+ // Extract label
+ typedef CTBronchi::Filter< itk::BinaryThresholdImageFilter< typename _TLabels::TImage, typename _TLabels::TImage > > _TExtract;
+ _TExtract extract;
+ extract.Get( )->SetInput( filter.Get( )->GetOutputLabels( ) );
+ extract.Get( )->SetInsideValue( this->m_InsideLabel );
+ extract.Get( )->SetOutsideValue( this->m_UndefinedLabel );
+ extract.Get( )->SetLowerThreshold( this->m_InsideLabel );
+ extract.Get( )->SetUpperThreshold( this->m_InsideLabel );
+ t1 = extract.Update( );
+ t += t1;
+ std::cout << "Extract labels executed in " << t1 << " s" << std::endl;
+
+ fastrw.Set( extract.Get( )->GetOutput( ) );
+ t1 = fastrw.Save( iname );
+ t += t1;
+ std::cout << "\"" << iname << "\" saved in " << t1 << " s." << std::endl;
+
+ } // fi
+ std::cout << "Fast random walker computed in " << t << " s." << std::endl;
+}
+
+// -------------------------------------------------------------------------
+template< class _TInput, class _TLabels, class _TVesselness, class _TSliceRW >
+void CTBronchi::Process::
+_SliceRW(
+ _TInput& input, _TLabels& labels, _TVesselness& vesselness, _TSliceRW& slicerw
+ )
+{
+ TString iname = std::get< 0 >( this->m_StrArgs[ "slicerw" ] );
+ double t = slicerw.Load( iname );
+ if( t < 0 )
+ {
+ t = 0;
+
+ // Random walk
+ typedef CTBronchi::Filter< fpa::Common::SliceBySliceRandomWalker< typename _TInput::TImage, typename _TLabels::TImage, typename _TVesselness::TImage > > TFilter;
+ TFilter filter;
+ filter.Get( )->SetInput( input.Get( ) );
+ filter.Get( )->SetInputLabels( labels.Get( ) );
+ filter.Get( )->SetInputVesselness( vesselness.Get( ) );
+ filter.Get( )->SetBeta( std::get< 0 >( this->m_DblArgs[ "beta" ] ) );
+ filter.Get( )->SetVesselnessThreshold( std::get< 0 >( this->m_DblArgs[ "slicerw_thr" ] ) );
+ filter.Get( )->SetEpsilon( std::get< 0 >( this->m_DblArgs[ "epsilon" ] ) );
+ double t1 = filter.Update( );
+ t += t1;
+ std::cout << "Extract labels executed in " << t1 << " s" << std::endl;
+
+ slicerw.Set( filter.Get( )->GetOutput( ) );
+ t1 = slicerw.Save( iname );
+ t += t1;
+ std::cout << "\"" << iname << "\" saved in " << t1 << " s." << std::endl;
+
+ } // fi
+ std::cout << "Slice by slice random walker computed in " << t << " s." << std::endl;
+}
+
+// -------------------------------------------------------------------------
+template< class _TInput >
+void CTBronchi::Process::
+_AndImages( _TInput& a, _TInput& b, _TInput& c )
+{
+ TString iname = std::get< 0 >( this->m_StrArgs[ "andrw" ] );
+ double t = c.Load( iname );
+ if( t < 0 )
+ {
+ t = 0;
+
+ // Random walk
+ typedef CTBronchi::Filter< itk::AndImageFilter< typename _TInput::TImage > > TFilter;
+ TFilter filter;
+ filter.Get( )->SetInput( 0, a.Get( ) );
+ filter.Get( )->SetInput( 1, b.Get( ) );
+ double t1 = filter.Update( );
+ t += t1;
+ std::cout << "And segmentations executed in " << t1 << " s" << std::endl;
+
+ c.Set( filter.Get( )->GetOutput( ) );
+ t1 = c.Save( iname );
+ t += t1;
+ std::cout << "\"" << iname << "\" saved in " << t1 << " s." << std::endl;
+
+ } // fi
+ std::cout << "And segmentations computed in " << t << " s." << std::endl;
+}
+
+// -------------------------------------------------------------------------
+template< class _TInput, class _TSkeleton >
+void CTBronchi::Process::
+_Skeleton( _TInput& a, _TSkeleton& s, const TString& fname )
+{
+ double t = s.Load( fname );
+ if( t < 0 )
+ {
+ t = 0;
+
+ typedef CTBronchi::Filter< fpa::Filters::Image::ExtractSkeleton< typename _TInput::TImage > > TFilter;
+ TFilter filter;
+ filter.Get( )->SetInput( a.Get( ) );
+ filter.Get( )->SeedFromMaximumDistanceOff( );
+ filter.Get( )->SetSeed( this->m_Seed.first );
+ filter.Get( )->GetDistanceMap( )->InsideIsPositiveOn( );
+ filter.Get( )->GetDistanceMap( )->SquaredDistanceOff( );
+ filter.Get( )->GetDistanceMap( )->UseImageSpacingOn( );
+ double t1 = filter.Update( );
+ t += t1;
+ std::cout << "Skeleton executed in " << t1 << " s" << std::endl;
+
+ s.Set( filter.Get( )->GetOutput( ) );
+ t1 = s.Save( fname );
+ t += t1;
+ std::cout << "\"" << fname << "\" saved in " << t1 << " s." << std::endl;
+
+ } // fi
+ std::cout << "Skeleton computed in " << t << " s." << std::endl;
+}
+