7 #include "imstkSurfaceMeshImageMask.h" 8 #include "imstkCleanMesh.h" 9 #include "imstkGeometryUtilities.h" 10 #include "imstkImageData.h" 11 #include "imstkLogger.h" 12 #include "imstkSurfaceMesh.h" 14 #include <vtkImageData.h> 15 #include <vtkImageStencil.h> 16 #include <vtkPolyData.h> 17 #include <vtkPolyDataToImageStencil.h> 21 SurfaceMeshImageMask::SurfaceMeshImageMask()
24 setRequiredInputType<SurfaceMesh>(0);
25 setOptionalInputType<ImageData>(1);
28 setOutput(std::make_shared<ImageData>(), 0);
38 SurfaceMeshImageMask::setInputMesh(std::shared_ptr<SurfaceMesh> mesh)
43 std::shared_ptr<ImageData>
44 SurfaceMeshImageMask::getOutputImage()
const 52 std::shared_ptr<SurfaceMesh> surfMeshInput = std::dynamic_pointer_cast<
SurfaceMesh>(
getInput(0));
53 std::shared_ptr<ImageData> refImageInput = std::dynamic_pointer_cast<
ImageData>(
getInput(1));
55 if (surfMeshInput ==
nullptr)
57 LOG(WARNING) <<
"Missing input surface mesh";
64 if (refImageInput !=
nullptr)
66 spacing = refImageInput->getSpacing();
68 origin = refImageInput->getOrigin();
70 const Vec3i& dim = refImageInput->getDimensions();
72 extent[1] = dim[0] - 1;
74 extent[3] = dim[1] - 1;
76 extent[5] = dim[2] - 1;
80 if (m_Dimensions[0] == -1 || m_Dimensions[1] == -1 || m_Dimensions[2] == -1)
82 LOG(WARNING) <<
"No reference image or desired image dimensions.";
87 surfMeshInput->computeBoundingBox(min, max);
89 Vec3d size = max - min;
92 spacing = size.cwiseQuotient(m_Dimensions.cast<
double>());
95 min -= spacing * m_BorderExtent;
96 max += spacing * m_BorderExtent;
101 extent[1] = (m_Dimensions[0] + m_BorderExtent) - 1;
103 extent[3] = (m_Dimensions[1] + m_BorderExtent) - 1;
105 extent[5] = (m_Dimensions[2] + m_BorderExtent) - 1;
107 origin = min - m_BorderExtent * spacing;
111 vtkNew<vtkImageData> baseImage;
112 baseImage->SetSpacing(spacing.data());
113 baseImage->SetExtent(extent);
114 baseImage->SetOrigin(origin.data());
115 baseImage->AllocateScalars(VTK_FLOAT, 1);
116 int* dim = baseImage->GetDimensions();
117 std::fill_n(static_cast<float*>(baseImage->GetScalarPointer()), dim[0] * dim[1] * dim[2], 1.0f);
120 vtkNew<vtkPolyDataToImageStencil> poly2Stencil;
122 poly2Stencil->SetOutputOrigin(origin.data());
123 poly2Stencil->SetOutputSpacing(spacing.data());
124 poly2Stencil->SetOutputWholeExtent(extent);
125 poly2Stencil->Update();
126 vtkNew<vtkImageStencil> imgStencil;
127 imgStencil->SetInputData(baseImage);
128 imgStencil->SetStencilData(poly2Stencil->GetOutput());
129 imgStencil->ReverseStencilOff();
130 imgStencil->SetBackgroundValue(0.0);
131 imgStencil->Update();
134 setOutput(GeometryUtils::copyToImageData(imgStencil->GetOutput()));
vtkSmartPointer< vtkPolyData > copyToVtkPolyData(std::shared_ptr< LineMesh > imstkMesh)
Converts imstk line mesh into a vtk polydata.
std::shared_ptr< Geometry > getInput(size_t port=0) const
Returns input geometry given port, returns nullptr if doesn't exist.
void setReferenceImage(std::shared_ptr< ImageData > refImage)
Optional input, used for information (dimensions, spacing, etc)
void setNumOutputPorts(const size_t numPorts)
Get/Set the amount of output ports.
std::shared_ptr< Geometry > getOutput(size_t port=0) const
Returns output geometry given port, returns nullptr if doesn't exist.
void setInput(std::shared_ptr< Geometry > inputGeometry, size_t port=0)
Set the input at the port.
Represents a set of triangles & vertices via an array of Vec3d double vertices & Vec3i integer indice...
void setOutput(std::shared_ptr< Geometry > inputGeometry, const size_t port=0)
Set the output at the port.
void setNumInputPorts(const size_t numPorts)
Get/Set the amount of input ports.
Class to represent 1, 2, or 3D image data (i.e. structured points)
void requestUpdate() override
Users can implement this for the logic to be run.