Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkSurfaceToImageFilter.h"
00019 #include "mitkTimeHelper.h"
00020
00021 #include <vtkPolyData.h>
00022 #include <vtkPolyDataToImageStencil.h>
00023 #include <vtkImageStencil.h>
00024 #include <vtkImageData.h>
00025 #include <vtkPolyData.h>
00026 #include <vtkLinearTransform.h>
00027 #include <vtkTriangleFilter.h>
00028 #include <vtkLinearExtrusionFilter.h>
00029 #include <vtkDataSetTriangleFilter.h>
00030 #include <vtkImageThreshold.h>
00031 #include <vtkImageMathematics.h>
00032 #include <vtkPolyDataNormals.h>
00033 #include <vtkTransformPolyDataFilter.h>
00034 #include <vtkTransform.h>
00035
00036
00037 mitk::SurfaceToImageFilter::SurfaceToImageFilter()
00038 : m_MakeOutputBinary( false ),
00039 m_BackgroundValue( -10000 )
00040 {
00041 }
00042
00043 mitk::SurfaceToImageFilter::~SurfaceToImageFilter()
00044 {
00045 }
00046
00047 void mitk::SurfaceToImageFilter::GenerateInputRequestedRegion()
00048 {
00049 mitk::Image* output = this->GetOutput();
00050 if((output->IsInitialized()==false) )
00051 return;
00052
00053 GenerateTimeInInputRegion(output, const_cast< mitk::Image * > ( this->GetImage() ));
00054 }
00055
00056 void mitk::SurfaceToImageFilter::GenerateOutputInformation()
00057 {
00058 mitk::Image *inputImage = (mitk::Image*)this->GetImage();
00059 mitk::Image::Pointer output = this->GetOutput();
00060
00061 itkDebugMacro(<<"GenerateOutputInformation()");
00062
00063 if((inputImage == NULL) ||
00064 (inputImage->IsInitialized() == false) ||
00065 (inputImage->GetTimeSlicedGeometry() == NULL)) return;
00066
00067 if (m_MakeOutputBinary)
00068 output->Initialize(mitk::PixelType(typeid(unsigned char)), *inputImage->GetTimeSlicedGeometry());
00069 else
00070 output->Initialize(inputImage->GetPixelType(), *inputImage->GetTimeSlicedGeometry());
00071
00072 output->SetPropertyList(inputImage->GetPropertyList()->Clone());
00073 }
00074
00075 void mitk::SurfaceToImageFilter::GenerateData()
00076 {
00077 mitk::Image::ConstPointer inputImage = this->GetImage();
00078 mitk::Image::Pointer output = this->GetOutput();
00079
00080 if(inputImage.IsNull())
00081 return;
00082
00083 if(output->IsInitialized()==false )
00084 return;
00085
00086 mitk::Image::RegionType outputRegion = output->GetRequestedRegion();
00087
00088 int tstart=outputRegion.GetIndex(3);
00089 int tmax=tstart+outputRegion.GetSize(3);
00090
00091 if ( tmax > 0)
00092 {
00093 int t;
00094 for(t=tstart;t<tmax;++t)
00095 {
00096 Stencil3DImage( t );
00097 }
00098 }
00099 else
00100 {
00101 Stencil3DImage( 0 );
00102 }
00103 }
00104
00105 void mitk::SurfaceToImageFilter::Stencil3DImage(int time)
00106 {
00107 const mitk::TimeSlicedGeometry *surfaceTimeGeometry = GetInput()->GetTimeSlicedGeometry();
00108 const mitk::TimeSlicedGeometry *imageTimeGeometry = GetImage()->GetTimeSlicedGeometry();
00109
00110
00111 int surfaceTimeStep = surfaceTimeGeometry->TimeStepToTimeStep( imageTimeGeometry, time );
00112
00113 vtkPolyData * polydata = ( (mitk::Surface*)GetInput() )->GetVtkPolyData( surfaceTimeStep );
00114
00115 vtkTransformPolyDataFilter * move=vtkTransformPolyDataFilter::New();
00116 move->SetInput(polydata);
00117 move->ReleaseDataFlagOn();
00118
00119 vtkTransform *transform=vtkTransform::New();
00120 Geometry3D* geometry = surfaceTimeGeometry->GetGeometry3D( surfaceTimeStep );
00121 geometry->TransferItkToVtkTransform();
00122 transform->PostMultiply();
00123 transform->Concatenate(geometry->GetVtkTransform()->GetMatrix());
00124
00125 Geometry3D* imageGeometry = imageTimeGeometry->GetGeometry3D(time);
00126 imageGeometry->TransferItkToVtkTransform();
00127 transform->Concatenate(imageGeometry->GetVtkTransform()->GetLinearInverse());
00128 move->SetTransform(transform);
00129 transform->Delete();
00130
00131 vtkPolyDataNormals * normalsFilter = vtkPolyDataNormals::New();
00132 normalsFilter->SetFeatureAngle(50);
00133 normalsFilter->SetConsistency(1);
00134 normalsFilter->SetSplitting(1);
00135 normalsFilter->SetFlipNormals(0);
00136 normalsFilter->ReleaseDataFlagOn();
00137
00138 normalsFilter->SetInput( move->GetOutput() );
00139 move->Delete();
00140
00141 vtkPolyDataToImageStencil * surfaceConverter = vtkPolyDataToImageStencil::New();
00142 surfaceConverter->SetTolerance( 0.0 );
00143 surfaceConverter->ReleaseDataFlagOn();
00144
00145 surfaceConverter->SetInput( normalsFilter->GetOutput() );
00146 normalsFilter->Delete();
00147
00148 vtkImageData *image = const_cast< mitk::Image * >(this->GetImage())->GetVtkImageData( time );
00149
00150
00151 vtkImageStencil * stencil = vtkImageStencil::New();
00152 stencil->SetInput( image );
00153 stencil->ReverseStencilOff();
00154 stencil->ReleaseDataFlagOn();
00155 stencil->SetStencil( surfaceConverter->GetOutput() );
00156 surfaceConverter->Delete();
00157
00158 if (m_MakeOutputBinary)
00159 {
00160 stencil->SetBackgroundValue( image->GetScalarTypeMin() );
00161
00162 vtkImageThreshold * threshold = vtkImageThreshold::New();
00163 threshold->SetInput( stencil->GetOutput() );
00164 threshold->ThresholdByLower( image->GetScalarTypeMin() );
00165 threshold->ReplaceInOn();
00166 threshold->ReplaceOutOn();
00167 threshold->SetInValue( 0 );
00168 threshold->SetOutValue( 1 );
00169 threshold->SetOutputScalarTypeToUnsignedChar();
00170 threshold->Update();
00171
00172 mitk::Image::Pointer output = this->GetOutput();
00173 output->SetVolume( threshold->GetOutput()->GetScalarPointer(), time );
00174
00175 threshold->Delete();
00176 }
00177 else
00178 {
00179 stencil->SetBackgroundValue( m_BackgroundValue );
00180 stencil->Update();
00181
00182 mitk::Image::Pointer output = this->GetOutput();
00183 output->SetVolume( stencil->GetOutput()->GetScalarPointer(), time );
00184 MITK_INFO << "stencil ref count: " << stencil->GetReferenceCount() << std::endl;
00185 }
00186 stencil->Delete();
00187 }
00188
00189
00190 const mitk::Surface *mitk::SurfaceToImageFilter::GetInput(void)
00191 {
00192 if (this->GetNumberOfInputs() < 1)
00193 {
00194 return 0;
00195 }
00196
00197 return static_cast<const mitk::Surface * >
00198 ( this->ProcessObject::GetInput(0) );
00199 }
00200
00201 void mitk::SurfaceToImageFilter::SetInput(const mitk::Surface *input)
00202 {
00203
00204 this->ProcessObject::SetNthInput(0,
00205 const_cast< mitk::Surface * >( input ) );
00206 }
00207
00208 void mitk::SurfaceToImageFilter::SetImage(const mitk::Image *source)
00209 {
00210 this->ProcessObject::SetNthInput( 1, const_cast< mitk::Image * >( source ) );
00211 }
00212
00213 const mitk::Image *mitk::SurfaceToImageFilter::GetImage(void)
00214 {
00215 return static_cast< const mitk::Image * >(this->ProcessObject::GetInput(1));
00216 }