//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt 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. //============================================================================ #ifndef vtk_m_filter_ImageDifference_h #define vtk_m_filter_ImageDifference_h #include #include namespace vtkm { namespace filter { /// \brief Construct an ImageDifference of a given DataSet /// /// The dataset generated by executing this filter is a Dataset with two Fields: /// - "image-diff": Uniform Structured Dataset, difference values of image A - B /// - "threshold-output": Uniform Structured Dataset, the magnitudes of the pixel differences /// /// The threshold-output is calculated for each pixel using the `vtkm::Magnitude` vector function /// on the individual pixel difference. /// class ImageDifference : public vtkm::filter::FilterField { public: using SupportedTypes = vtkm::TypeListFieldVec4; VTKM_CONT ImageDifference(); VTKM_CONT vtkm::IdComponent GetAverageRadius() const { return this->AverageRadius; } VTKM_CONT void SetAverageRadius(const vtkm::IdComponent& averageRadius) { this->AverageRadius = averageRadius; } VTKM_CONT vtkm::IdComponent GetPixelShiftRadius() const { return this->PixelShiftRadius; } VTKM_CONT void SetPixelShiftRadius(const vtkm::IdComponent& pixelShiftRadius) { this->PixelShiftRadius = pixelShiftRadius; } VTKM_CONT vtkm::FloatDefault GetAllowedPixelErrorRatio() const { return this->AllowedPixelErrorRatio; } VTKM_CONT void SetAllowedPixelErrorRatio(const vtkm::FloatDefault& pixelErrorRatio) { this->AllowedPixelErrorRatio = pixelErrorRatio; } VTKM_CONT vtkm::FloatDefault GetPixelDiffThreshold() const { return this->PixelDiffThreshold; } VTKM_CONT void SetPixelDiffThreshold(const vtkm::FloatDefault& threshold) { this->PixelDiffThreshold = threshold; } VTKM_CONT bool GetImageDiffWithinThreshold() const { return this->ImageDiffWithinThreshold; } VTKM_CONT void SetThresholdFieldName(const std::string& name) { this->ThresholdFieldName = name; } VTKM_CONT std::string GetThresholdFieldName() const { return this->ThresholdFieldName; } /// Choose the primary field to operate on. For Image difference A - B, A is the /// primary field. VTKM_CONT void SetPrimaryField( const std::string& name, vtkm::cont::Field::Association association = vtkm::cont::Field::Association::ANY) { this->SetActiveField(name, association); } VTKM_CONT std::string GetPrimaryFieldName() const { return this->GetActiveFieldName(); } VTKM_CONT vtkm::cont::Field::Association GetPrimaryFieldAssociation() const { return this->GetActiveFieldAssociation(); } /// Choose the secondary field to operate on. For Image difference A - B, B is the /// secondary field. VTKM_CONT void SetSecondaryField( const std::string& name, vtkm::cont::Field::Association association = vtkm::cont::Field::Association::ANY) { this->SecondaryFieldName = name; this->SecondaryFieldAssociation = association; } VTKM_CONT std::string GetSecondaryFieldName() const { return this->SecondaryFieldName; } VTKM_CONT vtkm::cont::Field::Association GetSecondaryFieldAssociation() const { return this->SecondaryFieldAssociation; } template VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& input, const vtkm::cont::ArrayHandle& primary, const vtkm::filter::FieldMetadata& fieldMetadata, vtkm::filter::PolicyBase policy); private: vtkm::IdComponent AverageRadius; vtkm::IdComponent PixelShiftRadius; vtkm::FloatDefault AllowedPixelErrorRatio; vtkm::FloatDefault PixelDiffThreshold; bool ImageDiffWithinThreshold; std::string SecondaryFieldName; vtkm::cont::Field::Association SecondaryFieldAssociation; std::string ThresholdFieldName; }; } // namespace filter } // namespace vtkm #include #endif // vtk_m_filter_ImageDifference_h