MeVisLab Toolbox Reference
mlSimilarVectorDirectionsClusterAlgorithm.h
Go to the documentation of this file.
1 /*************************************************************************************
2 **
3 ** Copyright 2007, MeVis Medical Solutions AG
4 **
5 ** The user may use this file in accordance with the license agreement provided with
6 ** the Software or, alternatively, in accordance with the terms contained in a
7 ** written agreement between the user and MeVis Medical Solutions AG.
8 **
9 ** For further information use the contact form at https://www.mevislab.de/contact
10 **
11 **************************************************************************************/
12 
13 #ifndef ML_SIMILAR_VECTOR_DIRECTIONS_CLUSTER_ALGORITHM_H
14 #define ML_SIMILAR_VECTOR_DIRECTIONS_CLUSTER_ALGORITHM_H
15 
16 #include "mlClusterAlgorithm.h"
17 #include "mlClusterRefVolume.h"
18 #include "mlClusterRefCollection.h"
19 
20 ML_START_NAMESPACE
21 
22 
30 class SimilarVectorDirectionsClusterAlgorithm : public ClusterAlgorithm<const void*, SimilarVectorDirectionsClusterAlgorithm>
31 {
32 public:
33 
36 
40  {
41  }
42 
44  {
45  const MLDataType inputDataType = _parameters.contentImage->getDataType();
46  const bool isFloatVector = isFloatVectorType(inputDataType);
47 
48  const size_t numVectorComponents = getNumVectorComponents(inputDataType);
49 
50  // Allow only vector images to be processed.
51  MLErrorCode errorCode = (numVectorComponents == 0) ? ML_BAD_DATA_TYPE : ML_RESULT_OK;
52 
53  if (ML_RESULT_OK == errorCode)
54  {
55  _numVectorComponents = static_cast<int>(numVectorComponents);
56  _isFloatVector = isFloatVector;
58  }
59  return errorCode;
60  }
61 
64  {
65  return static_cast<SimilarVectorDirectionsClusterVoxelType*>(position);
66  }
67 
69  {
70  return 0;
71  }
72 
76  {
77  double result = 0.0;
78 
79  if (_isFloatVector)
80  {
81  const float* inFloat1Ptr = reinterpret_cast<const float*>(vec1Ptr);
82  const float* inFloat2Ptr = reinterpret_cast<const float*>(vec2Ptr);
83  for (size_t i = 0u; i < static_cast<std::size_t>(_numVectorComponents); ++i)
84  {
85  result += inFloat1Ptr[i] * inFloat2Ptr[i];
86  }
87  }
88  else
89  {
90  const double* inDouble1Ptr = reinterpret_cast<const double*>(vec1Ptr);
91  const double* inDouble2Ptr = reinterpret_cast<const double*>(vec2Ptr);
92  for (size_t i = 0u; i < static_cast<std::size_t>(_numVectorComponents); ++i)
93  {
94  result += inDouble1Ptr[i] * inDouble2Ptr[i];
95  }
96  }
97  return result;
98  }
99 
104  {
105  double dotProduct = calcDotProduct(currentValue, neighborValue);
106  return std::abs(dotProduct) > _parameters.similarityToleranceVectors;
107  }
108 
110  {
111  return nullptr;
112  }
113 
114 private:
115 
116  ML_FORCE_INLINE bool isFloatVectorType(MLDataType inputDataType)
117  {
118  return (inputDataType == MLDataTypeFromName("vecf2")) ||
119  (inputDataType == MLDataTypeFromName("vecf3")) ||
120  (inputDataType == MLDataTypeFromName("vecf4")) ||
121  (inputDataType == MLDataTypeFromName("vecf5")) ||
122  (inputDataType == MLDataTypeFromName("vecf6")) ||
123  (inputDataType == MLDataTypeFromName("vecf7")) ||
124  (inputDataType == MLDataTypeFromName("vecf8")) ||
125  (inputDataType == MLDataTypeFromName("vecf9")) ||
126  (inputDataType == MLDataTypeFromName("vecf10")) ||
127  (inputDataType == MLDataTypeFromName("vecf16")) ||
128  (inputDataType == MLDataTypeFromName("vecf32")) ||
129  (inputDataType == MLDataTypeFromName("vecf64"));
130  }
131 
132  ML_FORCE_INLINE size_t getNumVectorComponents(MLDataType inputDataType)
133  {
134  return (inputDataType == MLDataTypeFromName("vecf2") || inputDataType == MLDataTypeFromName("vec2")) ? static_cast<size_t>(2) :
135  (inputDataType == MLDataTypeFromName("vecf3") || inputDataType == MLDataTypeFromName("vec3")) ? static_cast<size_t>(3) :
136  (inputDataType == MLDataTypeFromName("vecf4") || inputDataType == MLDataTypeFromName("vec4")) ? static_cast<size_t>(4) :
137  (inputDataType == MLDataTypeFromName("vecf5") || inputDataType == MLDataTypeFromName("vec5")) ? static_cast<size_t>(5) :
138  (inputDataType == MLDataTypeFromName("vecf6") || inputDataType == MLDataTypeFromName("vec6")) ? static_cast<size_t>(6) :
139  (inputDataType == MLDataTypeFromName("vecf7") || inputDataType == MLDataTypeFromName("vec7")) ? static_cast<size_t>(7) :
140  (inputDataType == MLDataTypeFromName("vecf8") || inputDataType == MLDataTypeFromName("vec8")) ? static_cast<size_t>(8) :
141  (inputDataType == MLDataTypeFromName("vecf9") || inputDataType == MLDataTypeFromName("vec9")) ? static_cast<size_t>(9) :
142  (inputDataType == MLDataTypeFromName("vecf10") || inputDataType == MLDataTypeFromName("vec10")) ? static_cast<size_t>(10) :
143  (inputDataType == MLDataTypeFromName("vecf16") || inputDataType == MLDataTypeFromName("vec16")) ? static_cast<size_t>(16) :
144  (inputDataType == MLDataTypeFromName("vecf32") || inputDataType == MLDataTypeFromName("vec32")) ? static_cast<size_t>(32) :
145  (inputDataType == MLDataTypeFromName("vecf64") || inputDataType == MLDataTypeFromName("vec64")) ? static_cast<size_t>(64) :
146  static_cast<size_t>(0);
147  }
148 
149  int _numVectorComponents;
150  bool _isFloatVector;
151 };
152 
153 
154 ML_END_NAMESPACE
155 
156 
157 #endif
Type specific implementations of the interface class for clustering algorithms.
Structure computes and holds all cluster information. For internal use.
Definition: mlClusters.h:29
Implementation of a clustering algorithm for vector data types.
ML_FORCE_INLINE bool isInTolerance(SimilarVectorDirectionsClusterVoxelType neighborValue, SimilarVectorDirectionsClusterVoxelType currentValue)
Tolerance calculation for vector images.
static ML_FORCE_INLINE SimilarVectorDirectionsClusterVoxelType getVoxel(void *position)
Get the typed voxel value for current position.
SimilarVectorDirectionsClusterAlgorithm(const ComputeClusterParameters &parameters, Clusters *clusters)
Constructor.
ClusterAlgorithm< const void *, SimilarVectorDirectionsClusterAlgorithm >::ClusterVoxelType SimilarVectorDirectionsClusterVoxelType
Voxel type to be used for the VectorClusterAlgorithm.
static ML_FORCE_INLINE const void * convertBackgroundValue(MLdouble)
ML_FORCE_INLINE double calcDotProduct(SimilarVectorDirectionsClusterVoxelType vec1Ptr, SimilarVectorDirectionsClusterVoxelType vec2Ptr)
Calculates the dot product of two n-dimensional vectors.
MLint32 MLDataType
MLDataType.
Definition: mlTypeDefs.h:684
MLEXPORT MLDataType MLDataTypeFromName(const char *const name)
Returns the id of the data type with name name.
#define ML_BAD_DATA_TYPE
A wrong or unexpected data type has been passed to an algorithm which often is a programming error; t...
Definition: mlTypeDefs.h:884
MLint32 MLErrorCode
Type of an ML Error code.
Definition: mlTypeDefs.h:818
#define ML_RESULT_OK
No error. Everything seems to be okay.
Definition: mlTypeDefs.h:826
#define ML_FORCE_INLINE
Forcing the use of 'inline' for methods.
Definition: mlMacros.h:87
double MLdouble
Definition: mlTypeDefs.h:223
DT abs(DT val)
Structure to hold parameters for cluster computation.