12 #ifndef mitkCLVoxeFeatures_cpp 13 #define mitkCLVoxeFeatures_cpp 24 #include "itkDiscreteGaussianImageFilter.h" 25 #include <itkLaplacianRecursiveGaussianImageFilter.h> 26 #include "itkHessianRecursiveGaussianImageFilter.h" 27 #include "itkUnaryFunctorImageFilter.h" 28 #include "vnl/algo/vnl_symmetric_eigensystem.h" 30 #include <itkSubtractImageFilter.h> 33 static std::vector<double>
splitDouble(std::string str,
char delimiter) {
34 std::vector<double>
internal;
35 std::stringstream ss(str);
38 while (std::getline(ss, tok, delimiter)) {
39 std::stringstream s2(tok);
41 internal.push_back(val);
49 template <
class TInput,
class TOutput>
50 class MatrixFirstEigenvalue
53 MatrixFirstEigenvalue() {}
54 virtual ~MatrixFirstEigenvalue() {}
58 inline TOutput operator ()(
const TInput& input)
61 if (input[0] < 0.01 && input[1] < 0.01 &&input[2] < 0.01 &&input[3] < 0.01 &&input[4] < 0.01 &&input[5] < 0.01)
63 vnl_symmetric_eigensystem_compute_eigenvals(input[0], input[1],input[2],input[3],input[4],input[5],a,b,c);
76 bool operator ==(
const MatrixFirstEigenvalue& other)
const 78 return !(*
this != other);
83 template<
typename TPixel,
unsigned int VImageDimension>
87 typedef itk::Image<TPixel, VImageDimension>
ImageType;
88 typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType > GaussFilterType;
90 typename GaussFilterType::Pointer gaussianFilter = GaussFilterType::New();
91 gaussianFilter->SetInput( itkImage );
92 gaussianFilter->SetVariance(variance);
93 gaussianFilter->Update();
97 template<
typename TPixel,
unsigned int VImageDimension>
101 typedef itk::Image<TPixel, VImageDimension>
ImageType;
102 typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType > GaussFilterType;
103 typedef itk::SubtractImageFilter<ImageType, ImageType, ImageType> SubFilterType;
105 typename GaussFilterType::Pointer gaussianFilter1 = GaussFilterType::New();
106 gaussianFilter1->SetInput( itkImage );
107 gaussianFilter1->SetVariance(variance);
108 gaussianFilter1->Update();
109 typename GaussFilterType::Pointer gaussianFilter2 = GaussFilterType::New();
110 gaussianFilter2->SetInput( itkImage );
111 gaussianFilter2->SetVariance(variance*0.66*0.66);
112 gaussianFilter2->Update();
113 typename SubFilterType::Pointer subFilter = SubFilterType::New();
114 subFilter->SetInput1(gaussianFilter1->GetOutput());
115 subFilter->SetInput2(gaussianFilter2->GetOutput());
120 template<
typename TPixel,
unsigned int VImageDimension>
124 typedef itk::Image<TPixel, VImageDimension>
ImageType;
125 typedef itk::DiscreteGaussianImageFilter< ImageType, ImageType > GaussFilterType;
126 typedef itk::LaplacianRecursiveGaussianImageFilter<ImageType, ImageType> LaplacianFilter;
128 typename GaussFilterType::Pointer gaussianFilter = GaussFilterType::New();
129 gaussianFilter->SetInput( itkImage );
130 gaussianFilter->SetVariance(variance);
131 gaussianFilter->Update();
132 typename LaplacianFilter::Pointer laplaceFilter = LaplacianFilter::New();
133 laplaceFilter->SetInput(gaussianFilter->GetOutput());
134 laplaceFilter->Update();
138 template<
typename TPixel,
unsigned int VImageDimension>
140 HessianOfGaussianFilter(itk::Image<TPixel, VImageDimension>* itkImage,
double variance, std::vector<mitk::Image::Pointer> &out)
142 typedef itk::Image<TPixel, VImageDimension>
ImageType;
144 typedef itk::HessianRecursiveGaussianImageFilter <ImageType> HessianFilterType;
145 typedef typename HessianFilterType::OutputImageType VectorImageType;
146 typedef Functor::MatrixFirstEigenvalue<typename VectorImageType::PixelType, double> DeterminantFunctorType;
147 typedef itk::UnaryFunctorImageFilter<VectorImageType, FloatImageType, DeterminantFunctorType> DetFilterType;
149 typename HessianFilterType::Pointer hessianFilter = HessianFilterType::New();
150 hessianFilter->SetInput(itkImage);
151 hessianFilter->SetSigma(std::sqrt(variance));
152 for (
unsigned int i = 0; i < VImageDimension; ++i)
154 typename DetFilterType::Pointer detFilter = DetFilterType::New();
155 detFilter->SetInput(hessianFilter->GetOutput());
156 detFilter->GetFunctor().order = i;
162 template<
typename TPixel,
unsigned int VImageDimension>
164 LocalHistograms2(itk::Image<TPixel, VImageDimension>* itkImage, std::vector<mitk::Image::Pointer> &out, std::vector<double> params)
166 typedef itk::Image<TPixel, VImageDimension>
ImageType;
169 double minimum = params[0];
170 double maximum = params[1];
171 int bins = std::round(params[2]);
174 double delta = (maximum - minimum) / bins;
176 typename MultiHistogramType::Pointer filter = MultiHistogramType::New();
177 filter->SetInput(itkImage);
178 filter->SetOffset(offset);
179 filter->SetDelta(delta);
180 filter->SetBins(bins);
182 for (
int i = 0; i < bins; ++i)
190 template<
typename TPixel,
unsigned int VImageDimension>
192 LocalHistograms(itk::Image<TPixel, VImageDimension>* itkImage, std::vector<mitk::Image::Pointer> &out,
double offset,
double delta)
194 typedef itk::Image<TPixel, VImageDimension>
ImageType;
197 typename MultiHistogramType::Pointer filter = MultiHistogramType::New();
198 filter->SetInput(itkImage);
199 filter->SetOffset(offset);
200 filter->SetDelta(delta);
202 for (
int i = 0; i < 11; ++i)
210 template<
typename TPixel,
unsigned int VImageDimension>
212 localStatistic(itk::Image<TPixel, VImageDimension>* itkImage, std::vector<mitk::Image::Pointer> &out,
int size)
214 typedef itk::Image<TPixel, VImageDimension>
ImageType;
217 typename MultiHistogramType::Pointer filter = MultiHistogramType::New();
218 filter->SetInput(itkImage);
219 filter->SetSize(size);
221 for (
int i = 0; i < 5; ++i)
230 int main(
int argc,
char* argv[])
248 parser.
setTitle(
"Global Image Feature calculator");
249 parser.
setDescription(
"Calculates different global statistics for a given segmentation / image combination");
252 std::map<std::string, us::Any> parsedArgs = parser.
parseArguments(argc, argv);
254 if (parsedArgs.size()==0)
258 if ( parsedArgs.count(
"help") || parsedArgs.count(
"h"))
264 std::string filename=parsedArgs[
"output"].ToString();
266 std::string extension =
".nii.gz";
267 if (parsedArgs.count(
"extension"))
269 extension = parsedArgs[
"extension"].ToString();
275 MITK_INFO <<
"Check for Local Histogram...";
276 if (parsedArgs.count(
"local-histogram"))
278 std::vector<mitk::Image::Pointer> outs;
279 auto ranges =
splitDouble(parsedArgs[
"local-histogram"].ToString(),
';');
280 if (ranges.size() < 2)
282 MITK_INFO <<
"Missing Delta and Offset for Local Histogram";
287 for (std::size_t i = 0; i < outs.size(); ++i)
289 std::string name = filename +
"-lh" + us::any_value_to_string<int>(i)+extension;
298 MITK_INFO <<
"Check for Local Histogram...";
299 if (parsedArgs.count(
"local-histogram2"))
301 std::vector<mitk::Image::Pointer> outs;
302 auto ranges =
splitDouble(parsedArgs[
"local-histogram2"].ToString(),
';');
303 if (ranges.size() < 3)
305 MITK_INFO <<
"Missing Delta and Offset for Local Histogram";
310 for (std::size_t i = 0; i < outs.size(); ++i)
312 std::string name = filename +
"-lh2" + us::any_value_to_string<int>(i)+extension;
321 MITK_INFO <<
"Check for Local Histogram...";
322 if (parsedArgs.count(
"local-statistic"))
324 std::vector<mitk::Image::Pointer> outs;
325 auto ranges =
splitDouble(parsedArgs[
"local-statistic"].ToString(),
';');
326 if (ranges.size() < 1)
332 for (std::size_t j = 0; j < ranges.size(); ++j)
335 for (std::size_t i = 0; i < outs.size(); ++i)
337 std::string name = filename +
"-lstat" + us::any_value_to_string<int>(ranges[j])+
"_" +us::any_value_to_string<int>(i)+extension;
350 if (parsedArgs.count(
"gaussian"))
352 MITK_INFO <<
"Calculate Gaussian... " << parsedArgs[
"gaussian"].ToString();
353 auto ranges =
splitDouble(parsedArgs[
"gaussian"].ToString(),
';');
355 for (std::size_t i = 0; i < ranges.size(); ++i)
357 MITK_INFO <<
"Gaussian with sigma: " << ranges[i];
370 if (parsedArgs.count(
"difference-of-gaussian"))
372 MITK_INFO <<
"Calculate Difference of Gaussian... " << parsedArgs[
"difference-of-gaussian"].ToString();
373 auto ranges =
splitDouble(parsedArgs[
"difference-of-gaussian"].ToString(),
';');
375 for (std::size_t i = 0; i < ranges.size(); ++i)
388 if (parsedArgs.count(
"laplace-of-gauss"))
390 MITK_INFO <<
"Calculate LoG... " << parsedArgs[
"laplace-of-gauss"].ToString();
391 auto ranges =
splitDouble(parsedArgs[
"laplace-of-gauss"].ToString(),
';');
393 for (std::size_t i = 0; i < ranges.size(); ++i)
406 if (parsedArgs.count(
"hessian-of-gauss"))
408 MITK_INFO <<
"Calculate HoG... " << parsedArgs[
"hessian-of-gauss"].ToString();
409 auto ranges =
splitDouble(parsedArgs[
"hessian-of-gauss"].ToString(),
';');
411 for (std::size_t i = 0; i < ranges.size(); ++i)
413 std::vector<mitk::Image::Pointer> outs;
US_Core_EXPORT std::string any_value_to_string(const Any &any)
void LaplacianOfGaussianFilter(itk::Image< TPixel, VImageDimension > *itkImage, double variance, mitk::Image::Pointer &output)
#define AccessByItk_3(mitkImage, itkImageTypeFunction, arg1, arg2, arg3)
MITKCORE_EXPORT bool operator!=(const InteractionEvent &a, const InteractionEvent &b)
int main(int argc, char *argv[])
void LocalHistograms2(itk::Image< TPixel, VImageDimension > *itkImage, std::vector< mitk::Image::Pointer > &out, std::vector< double > params)
itk::Image< unsigned char, 3 > ImageType
void setContributor(std::string contributor)
itk::Image< double, 3 > FloatImageType
void HessianOfGaussianFilter(itk::Image< TPixel, VImageDimension > *itkImage, double variance, std::vector< mitk::Image::Pointer > &out)
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)
MITKCORE_EXPORT bool operator==(const InteractionEvent &a, const InteractionEvent &b)
void GaussianFilter(itk::Image< TPixel, VImageDimension > *itkImage, double variance, mitk::Image::Pointer &output)
void DifferenceOfGaussFilter(itk::Image< TPixel, VImageDimension > *itkImage, double variance, mitk::Image::Pointer &output)
void LocalHistograms(itk::Image< TPixel, VImageDimension > *itkImage, std::vector< mitk::Image::Pointer > &out, double offset, double delta)
static std::vector< double > splitDouble(std::string str, char delimiter)
void setCategory(std::string category)
mitk::Image::Pointer image
void localStatistic(itk::Image< TPixel, VImageDimension > *itkImage, std::vector< mitk::Image::Pointer > &out, int size)
void setArgumentPrefix(const std::string &longPrefix, const std::string &shortPrefix)
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
static void Save(const mitk::BaseData *data, const std::string &path, bool setPathProperty=false)
Save a mitk::BaseData instance.
#define AccessByItk_2(mitkImage, itkImageTypeFunction, arg1, arg2)
void setTitle(std::string title)
void setDescription(std::string description)