diff --git a/Modules/PhotoacousticsLib/include/mitkPASpectralUnmixingFilterSimplex.h b/Modules/PhotoacousticsLib/include/mitkPASpectralUnmixingFilterSimplex.h index 47bb93f820..f463f57177 100644 --- a/Modules/PhotoacousticsLib/include/mitkPASpectralUnmixingFilterSimplex.h +++ b/Modules/PhotoacousticsLib/include/mitkPASpectralUnmixingFilterSimplex.h @@ -1,41 +1,52 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef MITKPHOTOACOUSTICSPECTRALUNMIXINGFILTERSIMPLEX_H #define MITKPHOTOACOUSTICSPECTRALUNMIXINGFILTERSIMPLEX_H #include #include namespace mitk { namespace pa { class MITKPHOTOACOUSTICSLIB_EXPORT SpectralUnmixingFilterSimplex : public SpectralUnmixingFilterBase { public: mitkClassMacro(SpectralUnmixingFilterSimplex, SpectralUnmixingFilterBase) - //itkFactorylessNewMacro(Self) - + itkFactorylessNewMacro(Self) + protected: SpectralUnmixingFilterSimplex(); virtual ~SpectralUnmixingFilterSimplex(); private: + int factorial(int n); + + virtual Eigen::VectorXf SpectralUnmixingAlgorithm(Eigen::Matrix EndmemberMatrix, + Eigen::VectorXf inputVector) override; + + Eigen::Matrix GenerateA(Eigen::Matrix EndmemberMatrix, + Eigen::VectorXf inputVector, int i); + + + Eigen::Matrix GenerateD2(Eigen::Matrix A); + float simplexVolume(Eigen::Matrix Matrix); }; } } #endif // MITKPHOTOACOUSTICSPECTRALUNMIXINGFILTERSIMPLEX_H diff --git a/Modules/PhotoacousticsLib/src/SUFilter/mitkPASpectralUnmixingFilterSimplex.cpp b/Modules/PhotoacousticsLib/src/SUFilter/mitkPASpectralUnmixingFilterSimplex.cpp index 552b11bd35..9aed1ca170 100644 --- a/Modules/PhotoacousticsLib/src/SUFilter/mitkPASpectralUnmixingFilterSimplex.cpp +++ b/Modules/PhotoacousticsLib/src/SUFilter/mitkPASpectralUnmixingFilterSimplex.cpp @@ -1,32 +1,115 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ -#include "mitkPASpectralUnmixingFilterSimplex.h" +#include // Includes for AddEnmemberMatrix -#include "mitkPAPropertyCalculator.h" #include +#include mitk::pa::SpectralUnmixingFilterSimplex::SpectralUnmixingFilterSimplex() { } mitk::pa::SpectralUnmixingFilterSimplex::~SpectralUnmixingFilterSimplex() { } + +Eigen::VectorXf mitk::pa::SpectralUnmixingFilterSimplex::SpectralUnmixingAlgorithm( + Eigen::Matrix EndmemberMatrix, Eigen::VectorXf inputVector) +{ + int numberOfChromophores = EndmemberMatrix.cols(); + Eigen::VectorXf resultVector(numberOfChromophores); + + float VolumeMax = simplexVolume(EndmemberMatrix); + for (int i = 0; i < numberOfChromophores; ++i) + { + Eigen::Matrix A = GenerateA(EndmemberMatrix, inputVector, i); + float Volume = simplexVolume(A); + resultVector[i] = Volume / VolumeMax; + } + + return resultVector; +} + +Eigen::Matrix GenerateA(Eigen::Matrix EndmemberMatrix, + Eigen::VectorXf inputVector, int i) +{ + Eigen::Matrix A = EndmemberMatrix; + int numberOfChromophores = EndmemberMatrix.cols(); + + for (int j = 0; j < numberOfChromophores; ++j) + { + A(i, j) = inputVector(j); + } + + return A; +} + +Eigen::Matrix GenerateD2(Eigen::Matrix A) +{ + Eigen::Matrix D2; + int numberOfChromophores = A.cols(); + + for (int i = 0; i < numberOfChromophores; ++i) + { + for (int j = 0; j < numberOfChromophores; ++j) + { + Eigen::VectorXf x = A.col(i) - A.col(j); + D2(i, j) = x.dot(x); + } + } + + return D2; +} + +float simplexVolume(Eigen::Matrix Matrix) +{ + float Volume; + int numberOfChromophores = Matrix.cols(); + Eigen::Matrix C; + Eigen::Matrix D2 = GenerateD2(Matrix); + + for (int i = 0; i < numberOfChromophores; ++i) + { + for (int j = 0; j < numberOfChromophores; ++j) + { + C(i, j) = D2(i, j); + } + C(i, numberOfChromophores) = 1; + for (int k = 0; k < numberOfChromophores; ++k) + { + C(numberOfChromophores, k) = 1; + } + C(numberOfChromophores, numberOfChromophores) = 0; + } + + float detC = C.determinant();// determinate von C + float denominator = (factorial(numberOfChromophores-1) ^ 2 * 2 ^ (numberOfChromophores - 1)*(-1) ^ numberOfChromophores; + + return Volume; +} + +int factorial(int n) +{ + if (n == 1) + return 1; + else + return n * factorial(n - 1); +}