1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5 #ifndef __ivq__ITK__ImageSkeletonWriter__hxx__
6 #define __ivq__ITK__ImageSkeletonWriter__hxx__
10 // -------------------------------------------------------------------------
11 template< class _TSkeleton >
12 void ivq::ITK::ImageSkeletonWriter< _TSkeleton >::
15 TSkeleton* input = const_cast< TSkeleton* >( this->GetInput( ) );
18 input->UpdateOutputInformation( );
19 input->UpdateOutputData( );
20 this->GenerateData( );
21 this->ReleaseInputs( );
26 // -------------------------------------------------------------------------
27 template< class _TSkeleton >
28 ivq::ITK::ImageSkeletonWriter< _TSkeleton >::
29 ImageSkeletonWriter( )
33 ivqITKInputConfigureMacro( Input, TSkeleton );
36 // -------------------------------------------------------------------------
37 template< class _TSkeleton >
38 ivq::ITK::ImageSkeletonWriter< _TSkeleton >::
39 ~ImageSkeletonWriter( )
43 // -------------------------------------------------------------------------
44 template< class _TSkeleton >
45 void ivq::ITK::ImageSkeletonWriter< _TSkeleton >::
48 // Write base information
49 std::stringstream out1, out2;
50 out1 << TSkeleton::Dimension << std::endl;
54 const TSkeleton* sk = this->GetInput( );
55 typename TMatrix::const_iterator mIt = sk->BeginEdgesRows( );
56 if( mIt != sk->EndEdgesRows( ) )
58 typename TMatrixRow::const_iterator rIt = mIt->second.begin( );
59 if( rIt != mIt->second.end( ) )
61 typename TEdges::const_iterator eIt = rIt->second.begin( );
62 if( eIt != rIt->second.end( ) )
64 const TPath* path = *eIt;
68 typename TPath::TSpacing spa = path->GetSpacing( );
69 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
70 out1 << spa[ d ] << " ";
72 typename TPath::TDirection dir = path->GetDirection( );
73 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
74 for( unsigned int e = 0; e < TSkeleton::Dimension; ++e )
75 out1 << dir[ d ][ e ] << " ";
77 typename TPath::TPoint ori = path->GetOrigin( );
78 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
79 out1 << ori[ d ] << " ";
83 std::vector< TVertex > end_points = sk->GetEndPoints( );
84 out1 << end_points.size( ) << std::endl;
85 typename std::vector< TVertex >::const_iterator epIt = end_points.begin( );
86 for( ; epIt != end_points.end( ); ++epIt )
88 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
89 out1 << ( *epIt )[ d ] << " ";
95 std::vector< TVertex > bifurcations = sk->GetBifurcations( );
96 out1 << bifurcations.size( ) << std::endl;
97 typename std::vector< TVertex >::const_iterator bIt = bifurcations.begin( );
98 for( ; bIt != bifurcations.end( ); ++bIt )
100 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
101 out1 << ( *bIt )[ d ] << " ";
107 unsigned long pathCount = 0;
108 mIt = sk->BeginEdgesRows( );
109 for( ; mIt != sk->EndEdgesRows( ); ++mIt )
111 typename TMatrixRow::const_iterator rIt = mIt->second.begin( );
112 for( ; rIt != mIt->second.end( ); ++rIt )
114 typename TEdges::const_iterator eIt = rIt->second.begin( );
115 for( ; eIt != rIt->second.end( ); ++eIt )
119 unsigned int size = path->GetSize( );
120 out2 << size << std::endl;
121 for( unsigned int i = 0; i < path->GetSize( ); ++i )
123 TVertex v = path->GetVertex( i );
124 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
125 out2 << v[ d ] << " ";
135 out1 << pathCount << std::endl << out2.str( );
147 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
150 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
151 for( unsigned int e = 0; e < TSkeleton::Dimension; ++e )
154 for( unsigned int d = 0; d < TSkeleton::Dimension; ++d )
157 out1 << "0" << std::endl;
158 out1 << "0" << std::endl;
163 std::ofstream file_stream( this->m_FileName.c_str( ), std::ofstream::binary );
166 << "Unable to write skeleton to \""
170 file_stream.write( out1.str( ).c_str( ), out1.str( ).size( ) );
173 #endif // __ivq__ITK__ImageSkeletonWriter__hxx__