[5d12a0]: / src / hessianObjectness.cxx

Download this file

84 lines (69 with data), 3.3 kB

 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
#include <nanobind/nanobind.h>
#include <nanobind/stl/vector.h>
#include <nanobind/stl/string.h>
#include <nanobind/stl/tuple.h>
#include <nanobind/stl/list.h>
#include <nanobind/ndarray.h>
#include <nanobind/stl/shared_ptr.h>
#include <exception>
#include <vector>
#include <string>
#include "itkImage.h"
#include "itkHessianToObjectnessMeasureImageFilter.h"
#include "itkMultiScaleHessianBasedMeasureImageFilter.h"
#include "itkSymmetricSecondRankTensor.h"
#include "itkNumericTraits.h"
#include "antsImage.h"
namespace nb = nanobind;
using namespace nb::literals;
template <typename ImageType>
AntsImage<ImageType> hessianObjectness( AntsImage<ImageType> & antsImage,
unsigned int objectDimension,
bool isBrightObject,
float sigmaMin,
float sigmaMax,
unsigned int numberOfSigmaSteps,
bool useSigmaLogarithmicSpacing,
float alpha,
float beta,
float gamma,
bool setScaleObjectnessMeasure )
{
using PixelType = typename ImageType::PixelType;
const unsigned int ImageDimension = ImageType::ImageDimension;
using RealPixelType = typename itk::NumericTraits<PixelType>::RealType;
using HessianPixelType = itk::SymmetricSecondRankTensor<RealPixelType, ImageDimension>;
using HessianImageType = itk::Image<HessianPixelType, ImageDimension>;
using ObjectnessFilterType = itk::HessianToObjectnessMeasureImageFilter<HessianImageType, ImageType>;
using MultiScaleEnhancementFilterType = itk::MultiScaleHessianBasedMeasureImageFilter<ImageType, HessianImageType, ImageType>;
typename ImageType::Pointer itkImage = antsImage.ptr;
typename ObjectnessFilterType::Pointer objectnessFilter = ObjectnessFilterType::New();
objectnessFilter->SetScaleObjectnessMeasure( setScaleObjectnessMeasure );
objectnessFilter->SetBrightObject( isBrightObject );
objectnessFilter->SetAlpha( alpha );
objectnessFilter->SetBeta( beta );
objectnessFilter->SetGamma( gamma );
objectnessFilter->SetObjectDimension( objectDimension );
typename MultiScaleEnhancementFilterType::Pointer multiScaleEnhancementFilter = MultiScaleEnhancementFilterType::New();
multiScaleEnhancementFilter->SetInput( itkImage );
if( useSigmaLogarithmicSpacing )
{
multiScaleEnhancementFilter->SetSigmaStepMethodToLogarithmic();
}
else
{
multiScaleEnhancementFilter->SetSigmaStepMethodToEquispaced();
}
multiScaleEnhancementFilter->SetSigmaMinimum( sigmaMin );
multiScaleEnhancementFilter->SetSigmaMaximum( sigmaMax );
multiScaleEnhancementFilter->SetNumberOfSigmaSteps( numberOfSigmaSteps );
multiScaleEnhancementFilter->SetHessianToMeasureFilter( objectnessFilter );
multiScaleEnhancementFilter->Update();
AntsImage<ImageType> outImage = { multiScaleEnhancementFilter->GetOutput() };
return outImage;
}
void local_hessianObjectness(nb::module_ &m)
{
m.def("hessianObjectnessF2", &hessianObjectness<itk::Image<float, 2>>);
m.def("hessianObjectnessF3", &hessianObjectness<itk::Image<float, 3>>);
}