23 #include <itksys/SystemTools.hxx> 31 struct InputParameters
34 std::string outputFileStruct;
36 std::string outputFileNumber;
47 parser.
setTitle(
"Mitk Spectral Unmixing App");
49 parser.
setContributor(
"Computer Assisted Medical Interventions, DKFZ");
57 "Input Filename (NAME.nrrd)",
64 "Output save name (name without ending!)",
78 "Input wavelengths (123 124 125 ... int blank int blank)",
85 "Input algorithm (string)",
92 "Input weights (123 124 125 ... int in % blank int in % blank)",
98 InputParameters input;
100 std::map<std::string, us::Any> parsedArgs = parser.
parseArguments(argc, argv);
110 if (parsedArgs.count(
"inputFilename"))
113 input.inputFilename =
us::any_cast<std::string>(parsedArgs[
"inputFilename"]);
121 if (parsedArgs.count(
"outputFileStruct"))
123 input.outputFileStruct =
us::any_cast<std::string>(parsedArgs[
"outputFileStruct"]);
131 if (parsedArgs.count(
"outputFileNumber"))
133 input.outputFileNumber =
us::any_cast<std::string>(parsedArgs[
"outputFileNumber"]);
138 mitkThrow() <<
"Error: No output number";
141 if (parsedArgs.count(
"inputWavelengths"))
150 if (parsedArgs.count(
"inputAlg"))
152 input.inputAlg =
us::any_cast<std::string>(parsedArgs[
"inputAlg"]);
160 if (parsedArgs.count(
"inputWeights"))
174 if (algorithm ==
"QR")
178 ->SetAlgorithm(mitk::pa::LinearSpectralUnmixingFilter::AlgortihmType::HOUSEHOLDERQR);
181 else if (algorithm ==
"SVD")
185 ->SetAlgorithm(mitk::pa::LinearSpectralUnmixingFilter::AlgortihmType::JACOBISVD);
188 else if (algorithm ==
"LU")
192 ->SetAlgorithm(mitk::pa::LinearSpectralUnmixingFilter::AlgortihmType::FULLPIVLU);
195 else if (algorithm ==
"NNLS")
199 ->SetAlgorithm(mitk::pa::SpectralUnmixingFilterVigra::VigraAlgortihmType::LARS);
202 else if (algorithm ==
"WLS")
206 ->SetAlgorithm(mitk::pa::SpectralUnmixingFilterVigra::VigraAlgortihmType::WEIGHTED);
208 std::vector<int> weightVec = weights;
210 for (
unsigned int i = 0; i < weightVec.size(); ++i)
213 ->AddWeight(weightVec[i]);
216 return spectralUnmixingFilter;
219 int main(
int argc,
char *argv[])
223 std::string algo = input.inputAlg;
224 std::string outputDir = input.outputFileStruct;
225 std::string outputNumber = input.outputFileNumber;
227 auto inputWls = input.inputWavelengths;
229 std::vector<int> wavelengths;
230 for (
unsigned int s = 0; s < inputWls.size(); ++s)
232 int wl = std::stoi(inputWls[s]);
233 wavelengths.push_back(wl);
241 auto inputW = input.inputWeights;
243 std::vector<int> Weights;
244 for (
unsigned int s = 0; s < inputW.size(); ++s)
246 int w = std::stoi(inputW[s]);
247 Weights.push_back(w);
258 m_SpectralUnmixingFilter->Verbose(
false);
259 m_SpectralUnmixingFilter->RelativeError(
false);
260 m_SpectralUnmixingFilter->AddChromophore(mitk::pa::PropertyCalculator::ChromophoreType::OXYGENATED);
261 m_SpectralUnmixingFilter->AddChromophore(mitk::pa::PropertyCalculator::ChromophoreType::DEOXYGENATED);
262 m_SpectralUnmixingFilter->AddOutputs(2);
264 for (
unsigned int wIdx = 0; wIdx < wavelengths.size(); ++wIdx)
266 m_SpectralUnmixingFilter->AddWavelength(wavelengths[wIdx]);
271 std::string inputImage = input.inputFilename;
272 auto m_inputImage = mitk::IOUtil::Load<mitk::Image>(inputImage);
274 m_SpectralUnmixingFilter->SetInput(m_inputImage);
276 m_SpectralUnmixingFilter->Update();
278 auto output1 = m_SpectralUnmixingFilter->GetOutput(0);
279 auto output2 = m_SpectralUnmixingFilter->GetOutput(1);
280 output1->SetSpacing(m_inputImage->GetGeometry()->GetSpacing());
281 output2->SetSpacing(m_inputImage->GetGeometry()->GetSpacing());
283 std::string unmixingOutputHbO2 = outputDir +
"HbO2." + outputNumber +
".nrrd";
284 std::string unmixingOutputHb = outputDir +
"Hb." + outputNumber +
".nrrd";
289 m_sO2->Verbose(
false);
291 m_sO2->SetInput(0, output1);
292 m_sO2->SetInput(1, output2);
298 sO2->SetSpacing(m_inputImage->GetGeometry()->GetSpacing());
299 tHb->SetSpacing(m_inputImage->GetGeometry()->GetSpacing());
301 std::string outputSo2 = outputDir +
"sO2." + outputNumber +
".nrrd";
304 std::string outputTHb = outputDir +
"tHb." + outputNumber +
".nrrd";
308 m_SpectralUnmixingFilter =
nullptr;
This filter is subclass of the spectral unmixing filter base. All algorithms in this class are based ...
InputParameters parseInput(int argc, char *argv[])
std::string inputFilename
void setContributor(std::string contributor)
ValueType * any_cast(Any *operand)
int main(int argc, char *argv[])
void addArgument(const std::string &longarg, const std::string &shortarg, Type type, const std::string &argLabel, const std::string &argHelp=std::string(), const us::Any &defaultValue=us::Any(), bool optional=true, bool ignoreRest=false, bool deprecated=false, mitkCommandLineParser::Channel channel=mitkCommandLineParser::Channel::None)
std::map< std::string, us::Any > parseArguments(const StringContainerType &arguments, bool *ok=nullptr)
This filter is subclass of the spectral unmixing filter base. All algorithms in this class are based ...
mitk::pa::SpectralUnmixingFilterBase::Pointer GetFilterInstance(std::string algorithm, std::vector< int > weights=std::vector< int >())
void setCategory(std::string category)
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
static void Save(const mitk::BaseData *data, const std::string &path, bool setPathProperty=false)
Save a mitk::BaseData instance.
std::vector< std::string > StringContainerType
void setTitle(std::string title)
void setDescription(std::string description)
void beginGroup(const std::string &description)