-
Notifications
You must be signed in to change notification settings - Fork 1
/
vtkPCAAnalysisFilter.h
143 lines (117 loc) · 4.74 KB
/
vtkPCAAnalysisFilter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*=========================================================================
Program: Visualization Toolkit
Module: vtkPCAAnalysisFilter.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.
=========================================================================*/
// .NAME vtkPCAAnalysisFilter - Performs principal component analysis of a set of aligned pointsets
// .SECTION Description
//
// vtkPCAAnalysisFilter is a filter that takes as input a set of aligned
// pointsets (any object derived from vtkPointSet) and performs
// a principal component analysis of the coordinates.
// This can be used to visualise the major or minor modes of variation
// seen in a set of similar biological objects with corresponding
// landmarks.
// vtkPCAAnalysisFilter is designed to work with the output from
// the vtkProcrustesAnalysisFilter
//
// Call SetNumberOfInputs(n) before calling SetInput(0) ... SetInput(n-1).
// Retrieve the outputs using GetOutput(0) ... GetOutput(n-1).
//
// vtkPCAAnalysisFilter is an implementation of (for example):
//
// T. Cootes et al. : Active Shape Models - their training and application.
// Computer Vision and Image Understanding, 61(1):38-59, 1995.
//
// The material can also be found in Tim Cootes' ever-changing online report
// published at his website:
// http://www.isbe.man.ac.uk/~bim/
//
// .SECTION Caveats
// All of the input pointsets must have the same number of points.
//
// .SECTION Thanks
// Rasmus Paulsen and Tim Hutton who developed and contributed this class
//
// .SECTION See Also
// vtkProcrustesAlignmentFilter
#ifndef __vtkPCAAnalysisFilter_h
#define __vtkPCAAnalysisFilter_h
#include "vtkPointSetAlgorithm.h"
class vtkFloatArray;
class vtkPointSet;
class VTK_HYBRID_EXPORT vtkPCAAnalysisFilter : public vtkPointSetAlgorithm
{
public:
vtkTypeMacro(vtkPCAAnalysisFilter,vtkPointSetAlgorithm);
// Description:
// Prints information about the state of the filter.
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Creates with similarity transform.
static vtkPCAAnalysisFilter *New();
// Description:
// Get the vector of eigenvalues sorted in descending order
vtkGetObjectMacro(Evals, vtkFloatArray);
// Description:
// Specify how many pointsets are going to be given as input.
void SetNumberOfInputs(int n);
// Description:
// Specify the input pointset with index idx.
// Call SetNumberOfInputs before calling this function.
void SetInput(int idx, vtkPointSet* p);
void SetInput(int idx, vtkDataObject* input);
// Description:
// Retrieve the input with index idx (usually only used for pipeline
// tracing).
vtkPointSet* GetInput(int idx);
// Description:
// Fills the shape with:
//
// mean + b[0] * sqrt(eigenvalue[0]) * eigenvector[0]
// + b[1] * sqrt(eigenvalue[1]) * eigenvector[1]
// ...
// + b[sizeb-1] * sqrt(eigenvalue[bsize-1]) * eigenvector[bsize-1]
//
// here b are the parameters expressed in standard deviations
// bsize is the number of parameters in the b vector
// This function assumes that shape is allready allocated
// with the right size, it just moves the points.
void GetParameterisedShape(vtkFloatArray *b, vtkPointSet* shape);
// Description:
// Return the bsize parameters b that best model the given shape
// (in standard deviations).
// That is that the given shape will be approximated by:
//
// shape ~ mean + b[0] * sqrt(eigenvalue[0]) * eigenvector[0]
// + b[1] * sqrt(eigenvalue[1]) * eigenvector[1]
// ...
// + b[bsize-1] * sqrt(eigenvalue[bsize-1]) * eigenvector[bsize-1]
void GetShapeParameters(vtkPointSet *shape, vtkFloatArray *b, int bsize);
// Description:
// Retrieve how many modes are necessary to model the given proportion of the variation.
// proportion should be between 0 and 1
int GetModesRequiredFor(double proportion);
protected:
vtkPCAAnalysisFilter();
~vtkPCAAnalysisFilter();
// Description:
// Usual data generation method.
virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
virtual int FillInputPortInformation(int port, vtkInformation *info);
private:
vtkPCAAnalysisFilter(const vtkPCAAnalysisFilter&); // Not implemented.
void operator=(const vtkPCAAnalysisFilter&); // Not implemented.
// Eigenvalues
vtkFloatArray *Evals;
// Matrix where each column is an eigenvector
double **evecMat2;
// The mean shape in a vector
double *meanshape;
};
#endif