1 #ifndef __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
2 #define __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__
5 #include <itkImageRegionIteratorWithIndex.h>
7 // -------------------------------------------------------------------------
8 template< class _TImage, class _TMST >
10 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
12 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
16 dynamic_cast< const _TImage* >( this->itk::ProcessObject::GetInput( 1 ) )
20 // -------------------------------------------------------------------------
21 template< class _TImage, class _TMST >
23 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
25 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
29 dynamic_cast< const _TImage* >( this->itk::ProcessObject::GetInput( 2 ) )
33 // -------------------------------------------------------------------------
34 template< class _TImage, class _TMST >
36 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
37 SetCostsImage( TImage* image )
39 this->itk::ProcessObject::SetNthInput( 1, const_cast< _TImage* >( image ) );
42 // -------------------------------------------------------------------------
43 template< class _TImage, class _TMST >
45 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
46 SetDistanceMap( TImage* image )
48 this->itk::ProcessObject::SetNthInput( 2, const_cast< _TImage* >( image ) );
51 // -------------------------------------------------------------------------
52 template< class _TImage, class _TMST >
53 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
54 ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
56 m_SquaredDistanceMap( false )
58 this->SetNumberOfRequiredInputs( 3 );
61 // -------------------------------------------------------------------------
62 template< class _TImage, class _TMST >
63 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
64 ~ExtractEndPointsAndBifurcationsFromMinimumSpanningTree( )
68 // -------------------------------------------------------------------------
69 template< class _TImage, class _TMST >
71 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
74 auto image = this->GetCostsImage( );
76 this->m_MarkImage = TMarkImage::New( );
77 this->m_MarkImage->SetLargestPossibleRegion( image->GetLargestPossibleRegion( ) );
78 this->m_MarkImage->SetRequestedRegion( image->GetRequestedRegion( ) );
79 this->m_MarkImage->SetBufferedRegion( image->GetBufferedRegion( ) );
80 this->m_MarkImage->SetDirection( image->GetDirection( ) );
81 this->m_MarkImage->SetOrigin( image->GetOrigin( ) );
82 this->m_MarkImage->SetSpacing( image->GetSpacing( ) );
83 this->m_MarkImage->Allocate( );
84 this->m_MarkImage->FillBuffer( 0 );
86 this->m_SkeletonImage = TMarkImage::New( );
87 this->m_SkeletonImage->SetLargestPossibleRegion( image->GetLargestPossibleRegion( ) );
88 this->m_SkeletonImage->SetRequestedRegion( image->GetRequestedRegion( ) );
89 this->m_SkeletonImage->SetBufferedRegion( image->GetBufferedRegion( ) );
90 this->m_SkeletonImage->SetDirection( image->GetDirection( ) );
91 this->m_SkeletonImage->SetOrigin( image->GetOrigin( ) );
92 this->m_SkeletonImage->SetSpacing( image->GetSpacing( ) );
93 this->m_SkeletonImage->Allocate( );
94 this->m_SkeletonImage->FillBuffer( 0 );
96 this->Superclass::GenerateData( );
99 // -------------------------------------------------------------------------
100 template< class _TImage, class _TMST >
102 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
103 _MarkSkeleton( const TVertex& v, const unsigned long& l )
105 if( this->m_SkeletonImage->GetRequestedRegion( ).IsInside( v ) )
106 this->m_SkeletonImage->SetPixel( v, l );
109 // -------------------------------------------------------------------------
110 template< class _TImage, class _TMST >
112 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
116 const unsigned long& l
119 double rr = r * double( 1.5 );
121 // Get marking region
122 auto rreg = this->m_MarkImage->GetRequestedRegion( );
123 auto spac = this->m_MarkImage->GetSpacing( );
124 TVertex ireg = rreg.GetIndex( );
125 TVertex jreg = ireg + rreg.GetSize( );
127 typename _TImage::SizeType size;
129 for( unsigned int d = 0; d < _TImage::ImageDimension; ++d )
131 unsigned long s = std::ceil( rr / double( spac[ d ] ) );
139 idx[ d ] = v[ d ] - s;
140 jdx[ d ] = v[ d ] + s;
143 if( idx[ d ] < ireg[ d ] ) idx[ d ] = ireg[ d ];
144 if( idx[ d ] > jreg[ d ] ) idx[ d ] = jreg[ d ];
145 if( jdx[ d ] < ireg[ d ] ) jdx[ d ] = ireg[ d ];
146 if( jdx[ d ] > jreg[ d ] ) jdx[ d ] = jreg[ d ];
147 size[ d ] = jdx[ d ] - idx[ d ] + 1;
150 typename _TImage::RegionType region;
151 region.SetIndex( idx );
152 region.SetSize( size );
155 typename _TImage::PointType c;
156 this->m_MarkImage->TransformIndexToPhysicalPoint( v, c );
157 itk::ImageRegionIteratorWithIndex< TMarkImage >
158 spIt( this->m_MarkImage, region );
159 for( spIt.GoToBegin( ); !spIt.IsAtEnd( ); ++spIt )
161 typename _TImage::PointType pnt;
162 this->m_MarkImage->TransformIndexToPhysicalPoint( spIt.GetIndex( ), pnt );
163 if( double( pnt.EuclideanDistanceTo( c ) ) <= rr || all )
164 if( spIt.Get( ) == 0 )
170 // -------------------------------------------------------------------------
171 template< class _TImage, class _TMST >
173 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
174 _Mark( const TVertex& v )
176 return( this->m_MarkImage->GetPixel( v ) );
179 // -------------------------------------------------------------------------
180 template< class _TImage, class _TMST >
181 unsigned long fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
182 _SkeletonMark( const TVertex& v )
184 return( this->m_SkeletonImage->GetPixel( v ) );
187 // -------------------------------------------------------------------------
188 template< class _TImage, class _TMST >
190 fpa::Image::ExtractEndPointsAndBifurcationsFromMinimumSpanningTree< _TImage, _TMST >::
191 _Radius( const TVertex& v )
193 double d = double( this->GetDistanceMap( )->GetPixel( v ) );
194 double s = std::fabs( d );
195 if( s > double( 0 ) )
197 if( this->m_SquaredDistanceMap )
198 return( s * std::sqrt( std::fabs( d ) ) );
203 #endif // __FPA__IMAGE__EXTRACTENDPOINTSANDBIFURCATIONSFROMMINIMUMSPANNINGTREE__HXX__