36 #ifndef VIGRA_TENSORUTILITIES_HXX
37 #define VIGRA_TENSORUTILITIES_HXX
40 #include "utilities.hxx"
41 #include "mathutil.hxx"
109 template <
class SrcIterator,
class SrcAccessor,
110 class DestIterator,
class DestAccessor>
111 void vectorToTensor(SrcIterator sul, SrcIterator slr, SrcAccessor src,
112 DestIterator dul, DestAccessor dest,
113 bool negateComponent2)
115 vigra_precondition(src.size(sul) == 2,
116 "vectorToTensor(): input image must have 2 bands.");
117 vigra_precondition(dest.size(dul) == 3,
118 "vectorToTensor(): output image must have 3 bands.");
120 int w = slr.x - sul.x;
121 int h = slr.y - sul.y;
123 for(
int y=0; y<h; ++y, ++sul.y, ++dul.y)
125 typename SrcIterator::row_iterator s = sul.rowIterator();
126 typename SrcIterator::row_iterator send = s + w;
127 typename DestIterator::row_iterator d = dul.rowIterator();
130 for(; s < send; ++s, ++d)
132 dest.setComponent(
sq(src.getComponent(s, 0)), d, 0);
133 dest.setComponent(-src.getComponent(s, 0)*src.getComponent(s, 1), d, 1);
135 dest.setComponent(
sq(src.getComponent(s, 1)), d, 2);
140 for(; s < send; ++s, ++d)
142 dest.setComponent(
sq(src.getComponent(s, 0)), d, 0);
143 dest.setComponent(src.getComponent(s, 0)*src.getComponent(s, 1), d, 1);
144 dest.setComponent(
sq(src.getComponent(s, 1)), d, 2);
150 template <
class SrcIterator,
class SrcAccessor,
151 class DestIterator,
class DestAccessor>
153 void vectorToTensor(SrcIterator sul, SrcIterator slr, SrcAccessor src,
154 DestIterator dul, DestAccessor dest)
159 template <
class SrcIterator,
class SrcAccessor,
160 class DestIterator,
class DestAccessor>
162 void vectorToTensor(triple<SrcIterator, SrcIterator, SrcAccessor> s,
163 pair<DestIterator, DestAccessor> d,
164 bool negateComponent2)
166 vectorToTensor(s.first, s.second, s.third, d.first, d.second, negateComponent2);
169 template <
class SrcIterator,
class SrcAccessor,
170 class DestIterator,
class DestAccessor>
172 void vectorToTensor(triple<SrcIterator, SrcIterator, SrcAccessor> s,
173 pair<DestIterator, DestAccessor> d)
175 vectorToTensor(s.first, s.second, s.third, d.first, d.second,
false);
230 template <
class SrcIterator,
class SrcAccessor,
231 class DestIterator,
class DestAccessor>
233 DestIterator dul, DestAccessor dest)
235 vigra_precondition(src.size(sul) == 3,
236 "tensorEigenRepresentation(): input image must have 3 bands.");
237 vigra_precondition(dest.size(dul) == 3,
238 "tensorEigenRepresentation(): output image must have 3 bands.");
240 int w = slr.x - sul.x;
241 int h = slr.y - sul.y;
243 for(
int y=0; y<h; ++y, ++sul.y, ++dul.y)
245 typename SrcIterator::row_iterator s = sul.rowIterator();
246 typename SrcIterator::row_iterator send = s + w;
247 typename DestIterator::row_iterator d = dul.rowIterator();
248 for(; s < send; ++s, ++d)
251 NumericTraits<typename SrcAccessor::component_type>::RealPromote TmpType;
252 TmpType d1 = src.getComponent(s,0) + src.getComponent(s,2);
253 TmpType d2 = src.getComponent(s,0) - src.getComponent(s,2);
254 TmpType d3 = TmpType(2.0) * src.getComponent(s,1);
255 TmpType d4 = (TmpType)
hypot(d2, d3);
257 dest.setComponent(0.5 * (d1 + d4), d, 0);
258 dest.setComponent(0.5 * (d1 - d4), d, 1);
259 if(d2==0.0 && d3==0.0)
261 dest.setComponent(0, d, 2);
271 template <
class SrcIterator,
class SrcAccessor,
272 class DestIterator,
class DestAccessor>
275 pair<DestIterator, DestAccessor> d)
329 template <
class SrcIterator,
class SrcAccessor,
330 class DestIterator,
class DestAccessor>
331 void tensorTrace(SrcIterator sul, SrcIterator slr, SrcAccessor src,
332 DestIterator dul, DestAccessor dest)
334 vigra_precondition(src.size(sul) == 3,
335 "tensorTrace(): input image must have 3 bands.");
337 int w = slr.x - sul.x;
338 int h = slr.y - sul.y;
340 for(
int y=0; y<h; ++y, ++sul.y, ++dul.y)
342 typename SrcIterator::row_iterator s = sul.rowIterator();
343 typename SrcIterator::row_iterator send = s + w;
344 typename DestIterator::row_iterator d = dul.rowIterator();
345 for(; s < send; ++s, ++d)
347 dest.set(src.getComponent(s,0) + src.getComponent(s,2), d);
352 template <
class SrcIterator,
class SrcAccessor,
353 class DestIterator,
class DestAccessor>
355 void tensorTrace(triple<SrcIterator, SrcIterator, SrcAccessor> s,
356 pair<DestIterator, DestAccessor> d)
358 tensorTrace(s.first, s.second, s.third, d.first, d.second);
419 template <
class SrcIterator,
class SrcAccessor,
420 class DestIterator1,
class DestAccessor1,
421 class DestIterator2,
class DestAccessor2>
423 DestIterator1 edgeul, DestAccessor1 edge,
424 DestIterator2 cornerul, DestAccessor2 corner)
426 vigra_precondition(src.size(sul) == 3,
427 "tensorToEdgeCorner(): input image must have 3 bands.");
428 vigra_precondition(edge.size(edgeul) == 2,
429 "tensorToEdgeCorner(): edge image must have 2 bands.");
431 int w = slr.x - sul.x;
432 int h = slr.y - sul.y;
434 for(
int y=0; y<h; ++y, ++sul.y, ++edgeul.y, ++cornerul.y)
436 typename SrcIterator::row_iterator s = sul.rowIterator();
437 typename SrcIterator::row_iterator send = s + w;
438 typename DestIterator1::row_iterator e = edgeul.rowIterator();
439 typename DestIterator2::row_iterator c = cornerul.rowIterator();
440 for(; s < send; ++s, ++e, ++c)
443 NumericTraits<typename SrcAccessor::component_type>::RealPromote TmpType;
444 TmpType d1 = src.getComponent(s,0) + src.getComponent(s,2);
445 TmpType d2 = src.getComponent(s,0) - src.getComponent(s,2);
446 TmpType d3 = 2.0 * src.getComponent(s,1);
447 TmpType d4 = (TmpType)
hypot(d2, d3);
449 edge.setComponent(d4, e, 0);
450 if(d2 == 0.0 && d3 == 0.0)
452 edge.setComponent(0.0, e, 1);
458 corner.set(d1 - d4, c);
463 template <
class SrcIterator,
class SrcAccessor,
464 class DestIterator1,
class DestAccessor1,
465 class DestIterator2,
class DestAccessor2>
468 pair<DestIterator1, DestAccessor1> edge,
469 pair<DestIterator2, DestAccessor2> corner)
472 edge.first, edge.second, corner.first, corner.second);