/*========================================================================= Program: Visualization Toolkit Module: vtkSubPixelPositionEdgels.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * @class vtkSubPixelPositionEdgels * @brief adjust edgel locations based on gradients. * * vtkSubPixelPositionEdgels is a filter that takes a series of linked * edgels (digital curves) and gradient maps as input. It then adjusts * the edgel locations based on the gradient data. Specifically, the * algorithm first determines the neighboring gradient magnitudes of * an edgel using simple interpolation of its neighbors. It then fits * the following three data points: negative gradient direction * gradient magnitude, edgel gradient magnitude and positive gradient * direction gradient magnitude to a quadratic function. It then * solves this quadratic to find the maximum gradient location along * the gradient orientation. It then modifies the edgels location * along the gradient orientation to the calculated maximum * location. This algorithm does not adjust an edgel in the direction * orthogonal to its gradient vector. * * @sa * vtkImageData vtkImageGradient vtkLinkEdgels */ #ifndef vtkSubPixelPositionEdgels_h #define vtkSubPixelPositionEdgels_h #include "vtkFiltersGeneralModule.h" // For export macro #include "vtkPolyDataAlgorithm.h" class vtkStructuredPoints; class vtkDataArray; class VTKFILTERSGENERAL_EXPORT vtkSubPixelPositionEdgels : public vtkPolyDataAlgorithm { public: static vtkSubPixelPositionEdgels *New(); vtkTypeMacro(vtkSubPixelPositionEdgels,vtkPolyDataAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE; //@{ /** * Set/Get the gradient data for doing the position adjustments. */ void SetGradMapsData(vtkStructuredPoints *gm); vtkStructuredPoints *GetGradMaps(); //@} //@{ /** * These methods can make the positioning look for a target scalar value * instead of looking for a maximum. */ vtkSetMacro(TargetFlag, int); vtkGetMacro(TargetFlag, int); vtkBooleanMacro(TargetFlag, int); vtkSetMacro(TargetValue, double); vtkGetMacro(TargetValue, double); //@} protected: vtkSubPixelPositionEdgels(); ~vtkSubPixelPositionEdgels() VTK_OVERRIDE; // Usual data generation method int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) VTK_OVERRIDE; int FillInputPortInformation(int port, vtkInformation *info) VTK_OVERRIDE; void Move(int xdim, int ydim, int zdim, int x, int y, float *img, vtkDataArray *inVecs, double *result, int z, double *aspect, double *resultNormal); void Move(int xdim, int ydim, int zdim, int x, int y, double *img, vtkDataArray *inVecs, double *result, int z, double *aspect, double *resultNormal); // extension for target instead of maximum int TargetFlag; double TargetValue; private: vtkSubPixelPositionEdgels(const vtkSubPixelPositionEdgels&) VTK_DELETE_FUNCTION; void operator=(const vtkSubPixelPositionEdgels&) VTK_DELETE_FUNCTION; }; #endif