1 /*========================================================================= 2 * 3 * Copyright Insight Software Consortium 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0.txt 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *=========================================================================*/ 18 #ifndef itkVectorNeighborhoodInnerProduct_h 19 #define itkVectorNeighborhoodInnerProduct_h 20 21 #include "itkNeighborhoodIterator.h" 22 #include "itkVector.h" 23 #include "itkConstSliceIterator.h" 24 #include "itkImageBoundaryCondition.h" 25 26 namespace itk 27 { 28 /** \class VectorNeighborhoodInnerProduct 29 * \brief Defines the inner product operation between an itk::Neighborhood 30 * and an itk::NeighborhoodOperator. 31 * 32 * This is an explicit implementation of what should really be a partial 33 * template specialization of NeighborhoodInnerProduct for itkVector. 34 * 35 * This class defines the inner product operation between an itk::Neighborhood 36 * and and itk::NeighborhoodOperator. The operator() method is overloaded 37 * to support various types of neighborhoods as well as inner products with 38 * slices of neighborhoods. 39 * 40 * \ingroup Operators 41 * 42 * \ingroup ITKCommon 43 */ 44 template< typename TImage > 45 class ITK_TEMPLATE_EXPORT VectorNeighborhoodInnerProduct 46 { 47 public: 48 /** Standard type alias */ 49 using Self = VectorNeighborhoodInnerProduct; 50 51 static constexpr unsigned int ImageDimension = TImage::ImageDimension; 52 53 /** Extract the pixel type and scalar type from the image template parameter. 54 */ 55 using PixelType = typename TImage::PixelType; 56 using ScalarValueType = typename PixelType::ValueType; 57 using NeighborhoodType = Neighborhood< PixelType, Self::ImageDimension >; 58 59 /** Extract the image and vector dimension from the image template parameter. 60 */ 61 static constexpr unsigned int VectorDimension = PixelType::Dimension; 62 63 /** Operator type alias */ 64 using OperatorType = Neighborhood< ScalarValueType, 65 Self::ImageDimension >; 66 67 /** Conversion operator. */ 68 PixelType operator()(const std::slice & s, 69 const ConstNeighborhoodIterator< TImage > & it, 70 const OperatorType & op) const; 71 72 /** Conversion operator. */ operator()73 PixelType operator()(const ConstNeighborhoodIterator< TImage > & it, 74 const OperatorType & op) const 75 { 76 return this->operator()(std::slice(0, it.Size(), 1), it, op); 77 } 78 79 PixelType operator()(const std::slice & s, const NeighborhoodType & N, 80 const OperatorType & op) const; 81 }; 82 } // end namespace itk 83 84 #ifndef ITK_MANUAL_INSTANTIATION 85 #include "itkVectorNeighborhoodInnerProduct.hxx" 86 #endif 87 88 #endif 89