16 #include <eigen3/Eigen/Dense> 30 Eigen::VectorXf mitk::pa::SpectralUnmixingFilterSimplex::SpectralUnmixingAlgorithm(
31 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> EndmemberMatrix, Eigen::VectorXf inputVector)
33 int numberOfChromophores = EndmemberMatrix.cols();
35 Eigen::VectorXf resultVector(numberOfChromophores);
36 Eigen::VectorXf normalizedInputVector(EndmemberMatrix.rows());
37 normalizedInputVector = Normalization(EndmemberMatrix, inputVector);
41 float VolumeMax = simplexVolume(EndmemberMatrix);
42 for (
int i = 0; i < numberOfChromophores; ++i)
44 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> A = GenerateA(EndmemberMatrix, normalizedInputVector, i);
45 float Volume = simplexVolume(A);
48 resultVector[i] = Volume / VolumeMax;
50 myfile <<
"resultVector["<<i<<
"]: " << resultVector[i] <<
"\n";
51 myfile <<
"Volume: " << Volume <<
"\n";
52 myfile <<
"VolumeMax: " << VolumeMax <<
"\n";
62 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> mitk::pa::SpectralUnmixingFilterSimplex::GenerateA
63 (Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> EndmemberMatrix, Eigen::VectorXf inputVector,
int i)
65 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> A = EndmemberMatrix;
66 int numberOfChromophores = EndmemberMatrix.cols();
68 for (
int j = 0; j < numberOfChromophores; ++j)
70 A(i, j) = inputVector(j);
76 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> mitk::pa::SpectralUnmixingFilterSimplex::GenerateD2
77 (Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> A)
79 int numberOfChromophores = A.cols();
81 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> D2(numberOfChromophores, numberOfChromophores);
83 for (
int i = 0; i < numberOfChromophores; ++i)
85 for (
int j = 0; j < numberOfChromophores; ++j)
87 Eigen::VectorXf x = A.col(i) - A.col(j);
91 Eigen::VectorXf y = x;
102 float mitk::pa::SpectralUnmixingFilterSimplex::simplexVolume(Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic>
Matrix)
105 int numberOfChromophores = Matrix.cols();
106 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> C(numberOfChromophores + 1, numberOfChromophores + 1);
107 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> D2 = GenerateD2(Matrix);
109 for (
int i = 0; i < numberOfChromophores; ++i)
111 for (
int j = 0; j < numberOfChromophores; ++j)
115 C(i, numberOfChromophores) = 1;
116 for (
int k = 0;
k < numberOfChromophores; ++
k)
118 C(numberOfChromophores,
k) = 1;
120 C(numberOfChromophores, numberOfChromophores) = 0;
123 float detC = -C.determinant();
124 float denominator = (factorial(numberOfChromophores - 1)) ^ 2 * 2 ^ (numberOfChromophores - 1)*(-1) ^ numberOfChromophores;
125 Volume = std::sqrt(detC / denominator);
135 int mitk::pa::SpectralUnmixingFilterSimplex::factorial(
int n)
140 return n * factorial(n - 1);
143 Eigen::VectorXf mitk::pa::SpectralUnmixingFilterSimplex::Normalization(
144 Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> EndmemberMatrix, Eigen::VectorXf inputVector)
146 int numberOfWavelengths = inputVector.rows();
147 Eigen::VectorXf result(numberOfWavelengths);
148 float NormalizationFactor = 1;
152 for (
int i = 0; i < numberOfWavelengths; ++i)
154 foo = EndmemberMatrix(i, 0) - EndmemberMatrix(i, 1);
155 if (std::abs(foo) > norm)
156 norm = std::abs(foo);
162 myfile <<
"Normalizationfactor " << NormalizationFactor <<
"\n";
164 for (
int i = 0; i < numberOfWavelengths; ++i)
167 result[i]=(inputVector[i]/NormalizationFactor);
The Volume class is designed to encapsulate volumetric information and to provide convenience methods...
SpectralUnmixingFilterSimplex()
~SpectralUnmixingFilterSimplex() override