14 #ifndef _OM_FILTER_HXX_
15 #define _OM_FILTER_HXX_
22 template <
class Mesh,
class MatrixT>
36 template <
class Mesh,
class MatrixT>
39 Mesh::VertexIter end = m_mesh->vertices_end();
40 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
41 m_mesh->getAttributes(vertex).push_back(m_mesh->property(matrixHandle, vertex).maxCoeff());
51 template <
class Mesh,
class MatrixT>
54 Mesh::VertexIter end = m_mesh->vertices_end();
59 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
61 current = m_mesh->property(matrixHandle, vertex);
62 data = current.data();
63 size = current.size();
64 dataCopy =
new Scalar[size];
65 memcpy(dataCopy, data, size *
sizeof(
Scalar));
67 std::sort(&(dataCopy[0]), &(dataCopy[size]));
68 m_mesh->getAttributes(vertex).push_back(dataCopy[size/2]);
80 template <
class Mesh,
class MatrixT>
83 Mesh::VertexIter end = m_mesh->vertices_end();
87 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
89 current = m_mesh->property(matrixHandle, vertex);
90 data = current.data();
91 size = current.size();
93 for (
int i = 0; i < size; ++i)
95 m_mesh->getAttributes(vertex).push_back(sum /= (
Scalar)size);
107 template <
class Mesh,
class MatrixT>
110 Mesh::VertexIter end = m_mesh->vertices_end();
114 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
116 current = m_mesh->property(matrixHandle, vertex);
117 data = current.data();
118 size = current.size();
121 for (
int i = 0; i < size; ++i)
125 for (
int i = 0; i < size; ++i)
126 variance += data[i] - sum;
128 m_mesh->getAttributes(vertex).push_back(variance /= (
Scalar)size);
138 template <
class Mesh,
class MatrixT>
141 Mesh::VertexIter end = m_mesh->vertices_end();
142 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
143 m_mesh->getAttributes(vertex).push_back(m_mesh->property(matrixHandle, vertex).minCoeff());
153 template <
class Mesh,
class MatrixT>
156 Mesh::VertexIter end = m_mesh->vertices_end();
158 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
160 min = abs(m_mesh->property(matrixHandle, vertex).minCoeff());
161 max = abs(m_mesh->property(matrixHandle, vertex).maxCoeff());
162 m_mesh->getAttributes(vertex).push_back(min > max ? min : max);
178 template <
class Mesh,
class MatrixT>
183 Mesh::VertexIter end = m_mesh->vertices_end();
185 int rows = m_filterKernel[0].rows();
186 int cols = m_filterKernel[0].cols();
187 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
189 current = m_mesh->property(matrixHandle, vertex);
190 if (rows < current.rows() || cols < current.cols())
191 filterOneSmall(vertex.handle(), matrixHandle);
193 m_mesh->getAttributes(vertex).push_back(filterOne(vertex.handle(), matrixHandle));
210 template <
class Mesh,
class MatrixT>
215 Mesh::VertexIter end = m_mesh->vertices_end();
217 int rows = m_filterKernel[0].rows();
218 int cols = m_filterKernel[0].cols();
219 for (Mesh::VertexIter vertex = m_mesh->vertices_begin(); vertex != end; ++vertex)
221 current = m_mesh->property(matrixHandle, vertex);
222 if (rows != current.rows() || cols != current.cols())
return false;
224 weightOne(vertex.handle(), matrixHandle);
238 template <
class Mesh,
class MatrixT>
242 Scalar *first = m_mesh->property(matrixHandle, vertex).data();
243 Scalar *filter = NULL;
246 for (
unsigned int i = 0; i < m_numKernels; ++i)
249 filter = m_filterKernel[i].data();
250 int i_max = m_filterKernel[i].size();
251 for (
int j = 0; j < i_max; ++j) aux += filter[j] * first[j];
262 template <
class Mesh,
class MatrixT>
265 MatrixT matrix = m_mesh->property(matrixHandle, vertex);
266 int rows = matrix.rows();
269 MatrixT filter = m_filterKernel[0];
270 int rowsF = filter.rows();
275 for (
int r = 0; r < rows; ++r)
276 for (
int c = 0; c < rows; ++c)
279 for (
int rF = -half; rF <= half; ++rF)
280 for (
int cF = -half; cF <= half; ++cF)
282 if (r+rF < 0 || c+cF < 0 || r+rF >= rows || r+rF >= rows)
continue;
285 result += matrix(r+rF, c+cF) * filter(rF+half, cF+half);
291 m_mesh->property(matrixHandle, vertex) = aux;
299 template <
class Mesh,
class MatrixT>
303 Scalar *first = m_mesh->property(matrixHandle, vertex).data();
304 Scalar *filter = NULL;
305 for (
unsigned int i = 0; i < m_numKernels; ++i)
307 filter = m_filterKernel[i].data();
308 int i_max = m_filterKernel[i].size();
309 for (
int i = 0; i < i_max; ++i) first[i] = filter[i] * first[i];
327 template <
class Mesh,
class MatrixT>
334 if (!file.is_open())
return false;
335 m_filterKernel.clear();
345 if (header !=
"Matrix")
return false;
351 if (rows <= 0 || cols <= 0)
return false;
353 m_filterKernel.push_back(
MatrixT(rows, cols));
356 for (
int r = 0; r < rows; ++r)
357 for (
int c = 0; c < rows; ++c)
359 if (file.eof())
return false;
360 file >> m_filterKernel.back()(r, c);
367 if (m_filterKernel.size() > 0)
369 int rows = m_filterKernel[0].rows();
370 int cols = m_filterKernel[0].cols();
371 for (
unsigned int i = 0; i < m_filterKernel.size(); ++i)
373 if (rows != m_filterKernel[i].rows() || cols != m_filterKernel[i].cols())
return false;
384 template <
class Mesh,
class MatrixT>
391 if (!file.is_open() || !m_loaded)
return false;
394 for (
unsigned int i = 0; i < m_numKernels; ++i)
398 file << m_filterKernel[i].rows() <<
" "<< m_filterKernel[i].cols() << std::endl;
401 for (
int r = 0; r < m_filterKernel[i].rows(); ++r)
403 for (
int c = 0; c < m_filterKernel[i].cols(); ++c)
404 file << m_filterKernel[i](r, c) <<
" ";
414 #endif // _OM_FILTER_HXX_