OpenWalnut
1.4.0
|
00001 //--------------------------------------------------------------------------- 00002 // 00003 // Project: OpenWalnut ( http://www.openwalnut.org ) 00004 // 00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS 00006 // For more information see http://www.openwalnut.org/copying 00007 // 00008 // This file is part of OpenWalnut. 00009 // 00010 // OpenWalnut is free software: you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as published by 00012 // the Free Software Foundation, either version 3 of the License, or 00013 // (at your option) any later version. 00014 // 00015 // OpenWalnut is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 // GNU Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public License 00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>. 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 * Create an itk image from a dataset. 00042 * 00043 * \param dataSet The dataset to convert. 00044 * 00045 * \return A pointer to a 3D itk image. 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::dynamic_pointer_cast< WGridRegular3D >( dataSet->getGrid() ); 00051 WAssert( grid, "" ); 00052 00053 // this is a shared-pointer 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 // copy direction matrix 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 * Create a dataset from an itk image. 00111 * 00112 * \param img The image to convert. 00113 * 00114 * \return A pointer to the dataset. 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( 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