00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef WITKIMAGECONVERSION_H
00026 #define WITKIMAGECONVERSION_H
00027
00028 #ifdef OW_USE_ITK
00029 #include <itkImage.h>
00030 #endif
00031
00032 #include <vector>
00033
00034 #include <boost/shared_ptr.hpp>
00035
00036 #include "WDataSetScalar.h"
00037
00038 #ifdef OW_USE_ITK
00039
00040
00041
00042
00043
00044
00045
00046
00047 template< typename T >
00048 typename itk::Image< T, 3 >::Pointer makeImageFromDataSet( boost::shared_ptr< WDataSetScalar const > dataSet )
00049 {
00050 boost::shared_ptr< WGridRegular3D > grid = boost::shared_dynamic_cast< WGridRegular3D >( dataSet->getGrid() );
00051 WAssert( grid, "" );
00052
00053
00054 typename itk::Image< T, 3 >::Pointer img = itk::Image< T, 3 >::New();
00055 typename itk::Image< T, 3 >::IndexType i;
00056 typename itk::Image< T, 3 >::SizeType s;
00057
00058 s[ 0 ] = grid->getNbCoordsX();
00059 s[ 1 ] = grid->getNbCoordsY();
00060 s[ 2 ] = grid->getNbCoordsZ();
00061 i[ 0 ] = i[ 1 ] = i[ 2 ] = 0;
00062
00063 typename itk::Image< T, 3 >::RegionType r;
00064 r.SetSize( s );
00065 r.SetIndex( i );
00066
00067 typename itk::Image< T, 3 >::SpacingType spacing;
00068 spacing[ 0 ] = grid->getOffsetX();
00069 spacing[ 1 ] = grid->getOffsetY();
00070 spacing[ 2 ] = grid->getOffsetZ();
00071
00072 typename itk::Image< T, 3 >::PointType orig;
00073 orig[ 0 ] = grid->getOrigin()[ 0 ];
00074 orig[ 1 ] = grid->getOrigin()[ 1 ];
00075 orig[ 2 ] = grid->getOrigin()[ 2 ];
00076
00077 img->SetRegions( r );
00078 img->SetSpacing( spacing );
00079 img->SetOrigin( orig );
00080 img->Allocate();
00081
00082
00083 typename itk::Image< T, 3 >::DirectionType dirMat;
00084 dirMat( 0, 0 ) = grid->getDirectionX()[ 0 ];
00085 dirMat( 0, 1 ) = grid->getDirectionY()[ 0 ];
00086 dirMat( 0, 2 ) = grid->getDirectionZ()[ 0 ];
00087 dirMat( 1, 0 ) = grid->getDirectionX()[ 1 ];
00088 dirMat( 1, 1 ) = grid->getDirectionY()[ 1 ];
00089 dirMat( 1, 2 ) = grid->getDirectionZ()[ 1 ];
00090 dirMat( 2, 0 ) = grid->getDirectionX()[ 2 ];
00091 dirMat( 2, 1 ) = grid->getDirectionY()[ 2 ];
00092 dirMat( 2, 2 ) = grid->getDirectionZ()[ 2 ];
00093
00094 img->SetDirection( dirMat );
00095
00096 for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
00097 {
00098 for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
00099 {
00100 for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
00101 {
00102 img->SetPixel( i, dataSet->getValueAt< T >( i[ 0 ], i[ 1 ], i[ 2 ] ) );
00103 }
00104 }
00105 }
00106 return img;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 template< typename T >
00117 boost::shared_ptr< WDataSetScalar > makeDataSetFromImage( typename itk::Image< T, 3 >::Pointer img )
00118 {
00119 typename itk::Image< T, 3 >::SizeType const& s = img->GetLargestPossibleRegion().GetSize();
00120
00121 WMatrix< double > smat( 4, 4 );
00122 typename itk::Image< T, 3 >::DirectionType dirMat = img->GetDirection();
00123
00124 smat( 0, 0 ) = dirMat( 0, 0 );
00125 smat( 0, 1 ) = dirMat( 0, 1 );
00126 smat( 0, 2 ) = dirMat( 0, 2 );
00127 smat( 1, 0 ) = dirMat( 1, 0 );
00128 smat( 1, 1 ) = dirMat( 1, 1 );
00129 smat( 1, 2 ) = dirMat( 1, 2 );
00130 smat( 2, 0 ) = dirMat( 2, 0 );
00131 smat( 2, 1 ) = dirMat( 2, 1 );
00132 smat( 2, 2 ) = dirMat( 2, 2 );
00133 smat( 0, 3 ) = img->GetOrigin()[ 0 ];
00134 smat( 1, 3 ) = img->GetOrigin()[ 1 ];
00135 smat( 2, 3 ) = img->GetOrigin()[ 2 ];
00136 smat( 3, 3 ) = 1.0;
00137 smat( 3, 0 ) = 0.0;
00138 smat( 3, 1 ) = 0.0;
00139 smat( 3, 2 ) = 0.0;
00140
00141 WGridTransformOrtho t( smat );
00142 boost::shared_ptr< WGrid > grid( new WGridRegular3D( s[ 0 ], s[ 1 ], s[ 2 ], t ) );
00143 boost::shared_ptr< std::vector< T > > v = boost::shared_ptr< std::vector< T > >( new std::vector< T >( s[ 0 ] * s[ 1 ] * s[ 2 ] ) );
00144
00145 typename itk::Image< T, 3 >::IndexType i;
00146
00147 for( i[ 0 ] = 0; i[ 0 ] < static_cast< int >( s[ 0 ] ); ++i[ 0 ] )
00148 {
00149 for( i[ 1 ] = 0; i[ 1 ] < static_cast< int >( s[ 1 ] ); ++i[ 1 ] )
00150 {
00151 for( i[ 2 ] = 0; i[ 2 ] < static_cast< int >( s[ 2 ] ); ++i[ 2 ] )
00152 {
00153 v->at( i[ 0 ] + i[ 1 ] * s[ 0 ] + i[ 2 ] * s[ 0 ] * s[ 1 ] ) = img->GetPixel( i );
00154 }
00155 }
00156 }
00157
00158 boost::shared_ptr< WValueSetBase > values( new WValueSet< T >( 0, 1, v, DataType< T >::type ) );
00159
00160 return boost::shared_ptr< WDataSetScalar >( new WDataSetScalar( values, grid ) );
00161 }
00162
00163 #endif // OW_USE_ITK
00164
00165 #endif // WITKIMAGECONVERSION_H