35class TMIImageCost:
public T
38 typedef typename T::Data Data;
39 typedef typename T::Force Force;
41 TMIImageCost(
size_t fbins, mia::PSplineKernel fkernel,
size_t rbins, mia::PSplineKernel rkernel,
double cut);
43 virtual double do_value(
const Data& a,
const Data& b)
const;
44 virtual double do_evaluate_force(
const Data& a,
const Data& b, Force& force)
const;
45 virtual void post_set_reference(
const Data& ref);
46 mutable mia::CSplineParzenMI m_parzen_mi;
51struct FEvalMI :
public mia::TFilter<double> {
52 FEvalMI( mia::CSplineParzenMI& parzen_mi):
53 m_parzen_mi(parzen_mi)
57 template <
typename T,
typename R>
58 FEvalMI::result_type operator () (
const T& a,
const R& b)
const
60 m_parzen_mi.fill(a.begin(), a.end(), b.begin(), b.end());
61 return m_parzen_mi.value();
63 mia::CSplineParzenMI& m_parzen_mi;
68TMIImageCost<T>::TMIImageCost(
size_t rbins, mia::PSplineKernel rkernel,
size_t mbins,
69 mia::PSplineKernel mkernel,
double cut):
70 m_parzen_mi(rbins, rkernel, mbins, mkernel, cut)
73 this->add(::mia::property_gradient);
77double TMIImageCost<T>::do_value(
const Data& a,
const Data& b)
const
79 FEvalMI essd(m_parzen_mi);
83template <
typename Force>
84struct FEvalForce:
public mia::TFilter<float> {
85 FEvalForce(Force& force, mia::CSplineParzenMI& parzen_mi):
87 m_parzen_mi(parzen_mi)
90 template <
typename T,
typename R>
91 float operator ()(
const T& a,
const R& b)
const
94 m_parzen_mi.fill(a.begin(), a.end(), b.begin(), b.end());
95 typename T::const_iterator ai = a.begin();
96 typename R::const_iterator bi = b.begin();
98 for (
size_t i = 0; i < a.size(); ++i, ++ai, ++bi) {
99 float delta = -m_parzen_mi.get_gradient_slow(*ai, *bi);
100 m_force[i] = gradient[i] * delta;
103 return m_parzen_mi.value();
107 mia::CSplineParzenMI& m_parzen_mi;
115double TMIImageCost<T>::do_evaluate_force(
const Data& a,
const Data& b, Force& force)
const
117 assert(a.get_size() == b.get_size());
118 assert(a.get_size() == force.get_size());
119 FEvalForce<Force> ef(force, m_parzen_mi);
124void TMIImageCost<T>::post_set_reference(
const Data& MIA_PARAM_UNUSED(ref))
134template <
typename CP,
typename C>
135class TMIImageCostPlugin:
public CP
138 TMIImageCostPlugin();
141 const std::string do_get_descr()
const;
142 unsigned int m_rbins;
143 unsigned int m_mbins;
144 mia::PSplineKernel m_mkernel;
145 mia::PSplineKernel m_rkernel;
146 float m_histogram_cut;
153template <
typename CP,
typename C>
154TMIImageCostPlugin<CP, C>::TMIImageCostPlugin():
160 TRACE(
"TMIImageCostPlugin<CP,C>::TMIImageCostPlugin()");
161 this->add_property(::mia::property_gradient);
162 this->add_parameter(
"rbins", mia::make_ci_param(m_rbins, 1u, 256u,
false,
163 "Number of histogram bins used for the reference image"));
164 this->add_parameter(
"mbins", mia::make_ci_param(m_mbins, 1u, 256u,
false,
165 "Number of histogram bins used for the moving image"));
166 this->add_parameter(
"rkernel", mia::make_param(m_rkernel,
"bspline:d=0",
false,
167 "Spline kernel for reference image parzen hinstogram"));
168 this->add_parameter(
"mkernel", mia::make_param(m_mkernel,
"bspline:d=3",
false,
169 "Spline kernel for moving image parzen hinstogram"));
170 this->add_parameter(
"cut", mia::make_ci_param(m_histogram_cut, 0.0f, 40.0f,
171 false,
"Percentage of pixels to cut at high and low "
172 "intensities to remove outliers"));
178template <
typename CP,
typename C>
179C *TMIImageCostPlugin<CP, C>::do_create()
const
181 return new TMIImageCost<C>(m_rbins, m_rkernel, m_mbins, m_mkernel, m_histogram_cut);
184template <
typename CP,
typename C>
185const std::string TMIImageCostPlugin<CP, C>::do_get_descr()
const
187 return "Spline parzen based mutual information.";
EXPORT_2D C2DFVectorfield get_gradient(const C2DImage &image)
#define NS_BEGIN(NS)
conveniance define to start a namespace
#define NS_END
conveniance define to end a namespace
static F::result_type filter(const F &f, const B &b)