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 #if(_MSC_VER==1200)
00019 #include <itkFixedCenterOfRotationAffineTransform.h>
00020 #include <itkIndex.h>
00021 #include <itkConceptChecking.h>
00022 #endif
00023 #include "mitkBoundingObjectCutter.h"
00024 #include "mitkBoundingObjectCutter.txx"
00025 #include "mitkTimeHelper.h"
00026 #include "mitkImageAccessByItk.h"
00027 #include "mitkBoundingObject.h"
00028 #include "mitkGeometry3D.h"
00029
00030
00031 namespace mitk
00032 {
00033
00034 void BoundingObjectCutter::SetBoundingObject( const mitk::BoundingObject* boundingObject )
00035 {
00036 m_BoundingObject = const_cast<mitk::BoundingObject*>(boundingObject);
00037
00038 this->ProcessObject::SetNthInput(1,
00039 const_cast< mitk::BoundingObject * >( boundingObject ) );
00040 }
00041
00042 const mitk::BoundingObject* BoundingObjectCutter::GetBoundingObject() const
00043 {
00044 return m_BoundingObject.GetPointer();
00045 }
00046
00047 BoundingObjectCutter::BoundingObjectCutter()
00048 : m_BoundingObject(NULL), m_InsideValue(1), m_OutsideValue(0), m_AutoOutsideValue(false),
00049 m_UseInsideValue(false), m_OutsidePixelCount(0), m_InsidePixelCount(0), m_UseWholeInputRegion(false)
00050 {
00051 this->SetNumberOfInputs(2);
00052 this->SetNumberOfRequiredInputs(2);
00053 m_InputTimeSelector = mitk::ImageTimeSelector::New();
00054 m_OutputTimeSelector = mitk::ImageTimeSelector::New();
00055 }
00056
00057 BoundingObjectCutter::~BoundingObjectCutter()
00058 {
00059 }
00060
00061 const std::type_info& BoundingObjectCutter::GetOutputPixelType()
00062 {
00063 return *this->GetInput()->GetPixelType().GetTypeId();
00064 }
00065
00066 void BoundingObjectCutter::GenerateInputRequestedRegion()
00067 {
00068 mitk::Image* output = this->GetOutput();
00069 if((output->IsInitialized()==false) || (m_BoundingObject.IsNull()) || (m_BoundingObject->GetTimeSlicedGeometry()->GetTimeSteps() == 0))
00070 return;
00071
00072
00073
00074
00075 GenerateTimeInInputRegion(output, const_cast< mitk::Image * > ( this->GetInput() ));
00076 GenerateTimeInInputRegion(output, m_BoundingObject.GetPointer());
00077 }
00078
00079 void BoundingObjectCutter::GenerateOutputInformation()
00080 {
00081 mitk::Image::Pointer output = this->GetOutput();
00082 if ((output->IsInitialized()) && (output->GetPipelineMTime() <= m_TimeOfHeaderInitialization.GetMTime()))
00083 return;
00084
00085 mitk::Image::Pointer input = const_cast< mitk::Image * > ( this->GetInput() );
00086
00087 itkDebugMacro(<<"GenerateOutputInformation()");
00088
00089 if(input.IsNull())
00090 return;
00091
00092 if((m_BoundingObject.IsNull()) || (m_BoundingObject->GetTimeSlicedGeometry()->GetTimeSteps() == 0))
00093 return;
00094
00095 mitk::Geometry3D* boGeometry = m_BoundingObject->GetGeometry();
00096 mitk::Geometry3D* inputImageGeometry = input->GetSlicedGeometry();
00097
00098
00099
00100 mitk::BoundingBox::Pointer boBoxRelativeToImage = boGeometry->CalculateBoundingBoxRelativeToTransform( inputImageGeometry->GetIndexToWorldTransform() );
00101
00102
00103
00104
00105
00106
00107
00108
00109 m_InputRequestedRegion = input->GetLargestPossibleRegion();
00110
00111
00112 mitk::SlicedData::IndexType index=m_InputRequestedRegion.GetIndex();
00113 mitk::BoundingBox::PointType min = boBoxRelativeToImage->GetMinimum();
00114 index[0] = (mitk::SlicedData::IndexType::IndexValueType)(min[0]+0.5);
00115 index[1] = (mitk::SlicedData::IndexType::IndexValueType)(min[1]+0.5);
00116 index[2] = (mitk::SlicedData::IndexType::IndexValueType)(min[2]+0.5);
00117
00118 mitk::SlicedData::SizeType size = m_InputRequestedRegion.GetSize();
00119 mitk::BoundingBox::PointType max = boBoxRelativeToImage->GetMaximum();
00120 size[0] = (mitk::SlicedData::SizeType::SizeValueType)(max[0]+0.5)-index[0];
00121 size[1] = (mitk::SlicedData::SizeType::SizeValueType)(max[1]+0.5)-index[1];
00122 size[2] = (mitk::SlicedData::SizeType::SizeValueType)(max[2]+0.5)-index[2];
00123
00124 mitk::SlicedData::RegionType boRegion(index, size);
00125
00126 if(m_UseWholeInputRegion == false)
00127 {
00128
00129 if(m_InputRequestedRegion.Crop(boRegion)==false)
00130 {
00131
00132 size.Fill(0);
00133 m_InputRequestedRegion.SetSize(size);
00134 boRegion.SetSize(size);
00135 m_BoundingObject->SetRequestedRegion(&boRegion);
00136 return;
00137 }
00138 }
00139
00140
00141
00142 input->SetRequestedRegion(&m_InputRequestedRegion);
00143
00144
00145
00146 unsigned int dimension = input->GetDimension();
00147 unsigned int *dimensions = new unsigned int [dimension];
00148 itk2vtk(m_InputRequestedRegion.GetSize(), dimensions);
00149 if(dimension>3)
00150 memcpy(dimensions+3, input->GetDimensions()+3, (dimension-3)*sizeof(unsigned int));
00151 output->Initialize(mitk::PixelType(GetOutputPixelType()), dimension, dimensions);
00152 delete [] dimensions;
00153
00154
00155 mitk::SlicedGeometry3D* slicedGeometry = output->GetSlicedGeometry();
00156
00157
00158
00159 AffineTransform3D::Pointer indexToWorldTransform = AffineTransform3D::New();
00160 indexToWorldTransform->SetParameters(input->GetSlicedGeometry()->GetIndexToWorldTransform()->GetParameters());
00161 slicedGeometry->SetIndexToWorldTransform(indexToWorldTransform);
00162
00163
00164 const mitk::SlicedData::IndexType& start = m_InputRequestedRegion.GetIndex();
00165 mitk::Point3D origin; vtk2itk(start, origin);
00166 inputImageGeometry->IndexToWorld(origin, origin);
00167 slicedGeometry->SetOrigin(origin);
00168
00169 mitk::TimeSlicedGeometry* timeSlicedGeometry = output->GetTimeSlicedGeometry();
00170 timeSlicedGeometry->InitializeEvenlyTimed(slicedGeometry, output->GetDimension(3));
00171 timeSlicedGeometry->CopyTimes(input->GetTimeSlicedGeometry());
00172
00173 m_TimeOfHeaderInitialization.Modified();
00174 }
00175
00176 void BoundingObjectCutter::ComputeData(mitk::Image* input3D, int boTimeStep)
00177 {
00178 AccessFixedDimensionByItk_2(input3D, CutImage, 3, this, boTimeStep);
00179 }
00180
00181 void BoundingObjectCutter::GenerateData()
00182 {
00183 mitk::Image::ConstPointer input = this->GetInput();
00184 mitk::Image::Pointer output = this->GetOutput();
00185
00186 if(input.IsNull())
00187 return;
00188
00189 if((output->IsInitialized()==false) || (m_BoundingObject.IsNull()) || (m_BoundingObject->GetTimeSlicedGeometry()->GetTimeSteps() == 0))
00190 return;
00191
00192 m_InputTimeSelector->SetInput(input);
00193 m_OutputTimeSelector->SetInput(this->GetOutput());
00194
00195 mitk::Surface::RegionType outputRegion = output->GetRequestedRegion();
00196 const mitk::TimeSlicedGeometry *outputTimeGeometry = output->GetTimeSlicedGeometry();
00197 const mitk::TimeSlicedGeometry *inputTimeGeometry = input->GetTimeSlicedGeometry();
00198 const mitk::TimeSlicedGeometry *boundingObjectTimeGeometry = m_BoundingObject->GetTimeSlicedGeometry();
00199 ScalarType timeInMS;
00200
00201 int timestep=0;
00202 int tstart=outputRegion.GetIndex(3);
00203 int tmax=tstart+outputRegion.GetSize(3);
00204
00205 int t;
00206 for(t=tstart;t<tmax;++t)
00207 {
00208 timeInMS = outputTimeGeometry->TimeStepToMS( t );
00209
00210 timestep = inputTimeGeometry->MSToTimeStep( timeInMS );
00211
00212 m_InputTimeSelector->SetTimeNr(timestep);
00213 m_InputTimeSelector->UpdateLargestPossibleRegion();
00214 m_OutputTimeSelector->SetTimeNr(t);
00215 m_OutputTimeSelector->UpdateLargestPossibleRegion();
00216
00217 timestep = boundingObjectTimeGeometry->MSToTimeStep( timeInMS );
00218
00219 ComputeData(m_InputTimeSelector->GetOutput(), timestep);
00220 }
00221
00222 m_InputTimeSelector->SetInput(NULL);
00223 m_OutputTimeSelector->SetInput(NULL);
00224
00225 m_TimeOfHeaderInitialization.Modified();
00226 }
00227
00228 }