iMSTK
Interactive Medical Simulation Toolkit
imstkImageGradient.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkImageGradient.h"
8 #include "imstkGeometryUtilities.h"
9 #include "imstkImageData.h"
10 #include "imstkLogger.h"
11 
12 #include <vtkImageData.h>
13 #include <vtkImageGradient.h>
14 #include <vtkImageGradientMagnitude.h>
15 
16 namespace imstk
17 {
18 ImageGradient::ImageGradient()
19 {
21  setRequiredInputType<ImageData>(0);
22 
24  setOutput(std::make_shared<PointSet>());
25 }
26 
27 void
28 ImageGradient::setInputImage(std::shared_ptr<ImageData> inputImage)
29 {
30  setInput(inputImage, 0);
31 }
32 
33 void
35 {
36  std::shared_ptr<ImageData> inputImage = std::dynamic_pointer_cast<ImageData>(getInput(0));
37  if (inputImage == nullptr)
38  {
39  LOG(WARNING) << "No input to compute gradients";
40  return;
41  }
42  if (inputImage->getNumComponents() != 1)
43  {
44  LOG(WARNING) << "Can only compute gradient on single channel image";
45  return;
46  }
47  vtkSmartPointer<vtkImageData> inputImageVtk = GeometryUtils::coupleVtkImageData(inputImage);
48  if (m_ComputeMagnitude)
49  {
50  vtkNew<vtkImageGradientMagnitude> gradientMagnitude;
51  gradientMagnitude->SetInputData(inputImageVtk);
52  gradientMagnitude->Update();
53  setOutput(GeometryUtils::copyToImageData(gradientMagnitude->GetOutput()));
54  }
55  else
56  {
57  vtkNew<vtkImageGradient> gradients;
58  gradients->SetInputData(inputImageVtk);
59  gradients->SetHandleBoundaries(true);
60  gradients->Update();
61  setOutput(GeometryUtils::copyToImageData(gradients->GetOutput()));
62  }
63 }
64 } // namespace imstk
void requestUpdate() override
Users can implement this for the logic to be run.
std::shared_ptr< Geometry > getInput(size_t port=0) const
Returns input geometry given port, returns nullptr if doesn&#39;t exist.
Compound Geometry.
void setNumOutputPorts(const size_t numPorts)
Get/Set the amount of output ports.
void setInput(std::shared_ptr< Geometry > inputGeometry, size_t port=0)
Set the input at the port.
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.
void setInputImage(std::shared_ptr< ImageData > inputImage)
Required input, port 0.
Class to represent 1, 2, or 3D image data (i.e. structured points)