18 #include <vtkImageData.h> 19 #include <vtkImageStencil.h> 20 #include <vtkPointData.h> 21 #include <vtkPolyData.h> 22 #include <vtkPolyDataNormals.h> 23 #include <vtkPolyDataToImageStencil.h> 24 #include <vtkSmartPointer.h> 25 #include <vtkTransform.h> 26 #include <vtkTransformPolyDataFilter.h> 29 : m_MakeOutputBinary(false), m_UShortBinaryPixelType(false), m_BackgroundValue(-10000), m_Tolerance(0.0)
51 itkDebugMacro(<<
"GenerateOutputInformation()");
60 output->Initialize(mitk::MakeScalarPixelType<unsigned short>(), *inputImage->
GetTimeGeometry());
64 output->Initialize(mitk::MakeScalarPixelType<unsigned char>(), *inputImage->
GetTimeGeometry());
80 if (inputImage.IsNull())
83 if (output->IsInitialized() ==
false)
88 int tstart = outputRegion.GetIndex(3);
89 int tmax = tstart + outputRegion.GetSize(3);
94 for (t = tstart; t < tmax; ++t)
110 unsigned int size =
sizeof(
unsigned char);
115 binaryImage->Initialize(mitk::MakeScalarPixelType<unsigned short>(), *this->
GetImage()->GetTimeGeometry(), 1, 1);
116 size =
sizeof(
unsigned short);
120 binaryImage->Initialize(mitk::MakeScalarPixelType<unsigned char>(), *this->
GetImage()->GetTimeGeometry(), 1, 1);
129 for (
unsigned int i = 0; i < binaryImage->GetDimension(); ++i)
131 size *= binaryImage->GetDimension(i);
135 memset(accessor.
GetData(), 1, size);
142 mitk::TimeStepType surfaceTimeStep = surfaceTimeGeometry->TimePointToTimeStep(matchingTimePoint);
147 vtkSmartPointer<vtkTransformPolyDataFilter> move = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
148 move->SetInputData(polydata);
149 move->ReleaseDataFlagOn();
151 vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
152 BaseGeometry *geometry = surfaceTimeGeometry->GetGeometryForTimeStep(surfaceTimeStep);
157 transform->PostMultiply();
161 transform->Concatenate(imageGeometry->
GetVtkTransform()->GetLinearInverse());
162 move->SetTransform(transform);
164 vtkSmartPointer<vtkPolyDataNormals> normalsFilter = vtkSmartPointer<vtkPolyDataNormals>::New();
165 normalsFilter->SetFeatureAngle(50);
166 normalsFilter->SetConsistency(1);
167 normalsFilter->SetSplitting(1);
168 normalsFilter->SetFlipNormals(0);
169 normalsFilter->ReleaseDataFlagOn();
171 normalsFilter->SetInputConnection(move->GetOutputPort());
173 vtkSmartPointer<vtkPolyDataToImageStencil> surfaceConverter = vtkSmartPointer<vtkPolyDataToImageStencil>::New();
175 surfaceConverter->ReleaseDataFlagOn();
177 surfaceConverter->SetInputConnection(normalsFilter->GetOutputPort());
183 unsigned char inval = 1;
184 vtkIdType count = image->GetNumberOfPoints();
185 for (vtkIdType i = 0; i < count; ++i)
187 image->GetPointData()->GetScalars()->SetTuple1(i, inval);
191 vtkSmartPointer<vtkImageStencil> stencil = vtkSmartPointer<vtkImageStencil>::New();
192 stencil->SetInputData(image);
193 stencil->ReverseStencilOff();
194 stencil->ReleaseDataFlagOn();
195 stencil->SetStencilConnection(surfaceConverter->GetOutputPort());
200 output->SetVolume(stencil->GetOutput()->GetScalarPointer(), time);
201 MITK_INFO <<
"stencil ref count: " << stencil->GetReferenceCount() << std::endl;
205 memset(accessor.
GetData(), 0, size);
206 output->SetVolume(accessor.
GetData(), time);
212 if (this->GetNumberOfInputs() < 1)
217 return static_cast<const mitk::Surface *
>(this->ProcessObject::GetInput(0));
223 this->ProcessObject::SetNthInput(0, const_cast<mitk::Surface *>(input));
228 this->ProcessObject::SetNthInput(1, const_cast<mitk::Image *>(source));
233 return static_cast<const mitk::Image *
>(this->ProcessObject::GetInput(1));
void GenerateInputRequestedRegion() override
Class for storing surfaces (vtkPolyData).
~SurfaceToImageFilter() override
virtual vtkImageData * GetVtkImageData()
const mitk::Surface * GetInput(void)
const mitk::PixelType GetPixelType(int n=0) const
Returns the PixelType of channel n.
vtkLinearTransform * GetVtkTransform() const
Get the m_IndexToWorldTransform as a vtkLinearTransform.
const mitk::Image * GetImage(void)
void * GetData()
Gives full data access.
void GenerateData() override
const mitk::TimeGeometry * GetTimeGeometry() const
Return the TimeGeometry of the data as const pointer.
bool m_UShortBinaryPixelType
void SetImage(const mitk::Image *source)
itk::ImageRegion< RegionDimension > RegionType
Image class for storing images.
virtual TimePointType TimeStepToTimePoint(TimeStepType timeStep) const =0
Converts a time step to a time point.
void Stencil3DImage(int time=0)
mitk::ScalarType TimePointType
std::vcl_size_t TimeStepType
mitk::Image::Pointer image
void GenerateTimeInInputRegion(const mitk::TimeGeometry *outputTimeGeometry, const TOutputRegion &outputRegion, const mitk::TimeGeometry *inputTimeGeometry, TInputRegion &inputRegion)
vcl_size_t GetSize() const
Get size of the PixelType in bytes.
mitk::PropertyList::Pointer GetPropertyList() const
Get the data's property list.
virtual bool IsInitialized() const
Check whether the data has been initialized, i.e., at least the Geometry and other header data has be...
virtual BaseGeometry::Pointer GetGeometryForTimeStep(TimeStepType timeStep) const =0
Returns the geometry which corresponds to the given time step.
OutputType * GetOutput()
Get the output data of this image source object.
ImageWriteAccessor class to get locked write-access for a particular image part.
void GenerateOutputInformation() override
mitk::BaseGeometry * GetGeometry(int t=0) const
Return the geometry, which is a TimeGeometry, of the data as non-const pointer.
BaseGeometry Describes the geometry of a data object.
virtual void SetInput(const mitk::Surface *surface)