35 class TMIImageCost:
public T {
37 typedef typename T::Data Data;
38 typedef typename T::Force Force;
42 virtual double do_value(
const Data& a,
const Data& b)
const;
43 virtual double do_evaluate_force(
const Data& a,
const Data& b, Force& force)
const;
44 virtual void post_set_reference(
const Data& ref);
45 mutable mia::CSplineParzenMI m_parzen_mi;
50 struct FEvalMI :
public mia::TFilter<double> {
51 FEvalMI( mia::CSplineParzenMI& parzen_mi):
52 m_parzen_mi(parzen_mi)
56 template <
typename T,
typename R>
57 FEvalMI::result_type operator () (
const T& a,
const R& b)
const {
58 m_parzen_mi.fill(a.begin(), a.end(), b.begin(), b.end());
59 return m_parzen_mi.value();
61 mia::CSplineParzenMI& m_parzen_mi;
68 m_parzen_mi(rbins, rkernel, mbins, mkernel, cut)
75 double TMIImageCost<T>::do_value(
const Data& a,
const Data& b)
const 77 FEvalMI essd(m_parzen_mi);
81 template <
typename Force>
82 struct FEvalForce:
public mia::TFilter<float> {
83 FEvalForce(Force& force, mia::CSplineParzenMI& parzen_mi):
85 m_parzen_mi(parzen_mi)
88 template <
typename T,
typename R>
89 float operator ()(
const T& a,
const R& b)
const {
91 m_parzen_mi.fill(a.begin(), a.end(), b.begin(), b.end());
92 typename T::const_iterator ai = a.begin();
93 typename R::const_iterator bi = b.begin();
95 for (
size_t i = 0; i < a.size(); ++i, ++ai, ++bi) {
96 float delta = -m_parzen_mi.get_gradient_slow(*ai, *bi);
97 m_force[i] = gradient[i] * delta;
99 return m_parzen_mi.value();
103 mia::CSplineParzenMI& m_parzen_mi;
110 template <
typename T>
111 double TMIImageCost<T>::do_evaluate_force(
const Data& a,
const Data& b, Force& force)
const 113 assert(a.get_size() == b.get_size());
114 assert(a.get_size() == force.get_size());
115 FEvalForce<Force> ef(force, m_parzen_mi);
119 template <
typename T>
120 void TMIImageCost<T>::post_set_reference(
const Data& MIA_PARAM_UNUSED(ref))
130 template <
typename CP,
typename C>
131 class TMIImageCostPlugin:
public CP {
133 TMIImageCostPlugin();
136 const std::string do_get_descr()
const;
137 unsigned int m_rbins;
138 unsigned int m_mbins;
141 float m_histogram_cut;
148 template <
typename CP,
typename C>
149 TMIImageCostPlugin<CP,C>::TMIImageCostPlugin():
155 TRACE(
"TMIImageCostPlugin<CP,C>::TMIImageCostPlugin()");
158 "Number of histogram bins used for the reference image"));
161 "Number of histogram bins used for the moving image"));
163 this->add_parameter(
"rkernel",
mia::make_param(m_rkernel,
"bspline:d=0",
false,
164 "Spline kernel for reference image parzen hinstogram"));
166 this->add_parameter(
"mkernel",
mia::make_param(m_mkernel,
"bspline:d=3",
false,
167 "Spline kernel for moving image parzen hinstogram"));
170 false,
"Percentage of pixels to cut at high and low " 171 "intensities to remove outliers"));
177 template <
typename CP,
typename C>
178 C *TMIImageCostPlugin<CP,C>::do_create()
const 180 return new TMIImageCost<C>(m_rbins, m_rkernel, m_mbins, m_mkernel, m_histogram_cut);
183 template <
typename CP,
typename C>
184 const std::string TMIImageCostPlugin<CP,C>::do_get_descr()
const 186 return "Spline parzen based mutual information.";
CParameter * make_param(T &value, bool required, const char *descr)
#define NS_BEGIN(NS)
conveniance define to start a namespace
static F::result_type filter(const F &f, const B &b)
std::shared_ptr< CSplineKernel > PSplineKernel
EXPORT_2D C2DFVectorfield get_gradient(const C2DImage &image)
EXPORT_CORE const char * property_gradient
constant defining the gradient property
CParameter * make_ci_param(T &value, S1 lower_bound, S2 upper_bound, bool required, const char *descr)
#define NS_END
conveniance define to end a namespace