37 template <typename
TCost>
38 class TSSDCost: public
TCost {
46 virtual double do_value(
const Data& a,
const Data& b)
const;
47 virtual double do_evaluate_force(
const Data& a,
const Data& b, Force& force)
const;
52 struct FEvalSSD :
public mia::TFilter<double> {
53 FEvalSSD(
bool normalize):m_normalize(normalize){}
55 template <
typename T,
typename R>
57 double operator ()(T a, R b)
const {
58 double d = (double)a - (
double)b;
63 template <
typename T,
typename R>
64 FEvalSSD::result_type operator () (
const T& a,
const R& b)
const {
65 double scale = m_normalize ? 0.5 / a.size() : 0.5;
66 return scale * inner_product(a.begin(), a.end(), b.begin(), 0.0, ::std::plus<double>(),
67 SQD<typename T::value_type , typename R::value_type >());
73 template <
typename TCost>
74 TSSDCost<TCost>::TSSDCost():
77 this->add(::mia::property_gradient);
80 template <
typename TCost>
81 TSSDCost<TCost>::TSSDCost(
bool normalize):
82 m_normalize(normalize)
84 this->add(::mia::property_gradient);
87 template <
typename TCost>
88 double TSSDCost<TCost>::do_value(
const Data& a,
const Data& b)
const
90 FEvalSSD essd(m_normalize);
94 template <
typename Force>
95 struct FEvalForce:
public mia::TFilter<float> {
98 m_normalize(normalize)
101 template <
typename T,
typename R>
102 float operator ()(
const T& a,
const R& b)
const {
107 auto fi = m_force.begin();
108 auto gi = gradient.begin();
110 float scale = m_normalize ? 1.0 / a.size() : 1.0;
112 for (
size_t i = 0; i < a.size(); ++i, ++ai, ++bi, ++fi, ++gi) {
113 float delta = float(*ai) - float(*bi);
114 *fi = *gi * delta * scale;
115 cost += delta * delta * scale;
129 template <
typename TCost>
130 double TSSDCost<TCost>::do_evaluate_force(
const Data& a,
const Data& b, Force& force)
const
132 assert(a.get_size() == b.get_size());
133 assert(a.get_size() == force.get_size());
134 FEvalForce<Force> ef(force, m_normalize);
144 template <
typename CP,
typename C>
145 class TSSDCostPlugin:
public CP {
157 template <
typename CP,
typename C>
158 TSSDCostPlugin<CP,C>::TSSDCostPlugin():
162 TRACE(
"TSSDCostPlugin<CP,C>::TSSDCostPlugin()");
163 this->add_property(::mia::property_gradient);
165 "Set whether the metric should be normalized by the number of image pixels"));
172 template <
typename CP,
typename C>
173 C *TSSDCostPlugin<CP,C>::do_create()
const
175 return new TSSDCost<C>(m_normalize);