37 #ifndef VIGRA_CONVOLUTION_HXX
38 #define VIGRA_CONVOLUTION_HXX
41 #include "stdconvolution.hxx"
42 #include "separableconvolution.hxx"
43 #include "recursiveconvolution.hxx"
44 #include "nonlineardiffusion.hxx"
45 #include "combineimages.hxx"
254 template <
class SrcIterator,
class SrcAccessor,
255 class DestIterator,
class DestAccessor,
258 SrcIterator slowerright, SrcAccessor sa,
259 DestIterator dupperleft, DestAccessor da,
263 NumericTraits<typename SrcAccessor::value_type>::RealPromote
268 destImage(tmp), kernel1d(kx));
270 destIter(dupperleft, da), kernel1d(ky));
273 template <
class SrcIterator,
class SrcAccessor,
274 class DestIterator,
class DestAccessor,
277 convolveImage(triple<SrcIterator, SrcIterator, SrcAccessor> src,
278 pair<DestIterator, DestAccessor> dest,
279 Kernel1D<T>
const & kx, Kernel1D<T>
const & ky)
282 dest.first, dest.second, kx, ky);
358 template <
class SrcIterator,
class SrcAccessor,
359 class DestIterator,
class DestAccessor>
360 void simpleSharpening(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc,
361 DestIterator dest_ul, DestAccessor dest_acc,
double sharpening_factor)
364 vigra_precondition(sharpening_factor >= 0.0,
365 "simpleSharpening(): amount of sharpening must be >= 0.");
367 Kernel2D<double> kernel;
369 kernel.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0,
370 -sharpening_factor/8.0, 1.0+sharpening_factor*0.75, -sharpening_factor/8.0,
371 -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0;
374 kernel.center(), kernel.accessor(),
375 kernel.upperLeft(), kernel.lowerRight() , BORDER_TREATMENT_REFLECT );
378 template <
class SrcIterator,
class SrcAccessor,
379 class DestIterator,
class DestAccessor>
382 pair<DestIterator, DestAccessor> dest,
double sharpening_factor)
385 dest.first, dest.second, sharpening_factor);
455 template <
class SrcIterator,
class SrcAccessor,
456 class DestIterator,
class DestAccessor>
458 DestIterator dest_ul, DestAccessor dest_acc,
double sharpening_factor,
461 vigra_precondition(sharpening_factor >= 0.0,
462 "gaussianSharpening(): amount of sharpening must be >= 0");
463 vigra_precondition(scale >= 0.0,
464 "gaussianSharpening(): scale parameter should be >= 0.");
466 typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote ValueType;
468 BasicImage<ValueType> tmp(src_lr - src_ul, SkipInitialization);
470 gaussianSmoothing(src_ul, src_lr, src_acc, tmp.upperLeft(), tmp.accessor(), scale);
472 SrcIterator i_src = src_ul;
473 DestIterator i_dest = dest_ul;
474 typename BasicImage<ValueType>::traverser tmp_ul = tmp.upperLeft();
475 typename BasicImage<ValueType>::traverser i_tmp = tmp_ul;
476 typename BasicImage<ValueType>::Accessor tmp_acc = tmp.accessor();
478 for(; i_src.y != src_lr.y ; i_src.y++, i_dest.y++, i_tmp.y++ )
480 for (;i_src.x != src_lr.x ; i_src.x++, i_dest.x++, i_tmp.x++ )
482 dest_acc.set((1.0 + sharpening_factor)*src_acc(i_src) - sharpening_factor*tmp_acc(i_tmp), i_dest);
485 i_dest.x = dest_ul.x;
490 template <
class SrcIterator,
class SrcAccessor,
491 class DestIterator,
class DestAccessor>
493 pair<DestIterator, DestAccessor> dest,
double sharpening_factor,
497 dest.first, dest.second,
498 sharpening_factor, scale);
561 template <
class SrcIterator,
class SrcAccessor,
562 class DestIterator,
class DestAccessor>
564 gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa,
565 DestIterator dupperleft, DestAccessor da,
566 double scale_x,
double scale_y)
569 NumericTraits<typename SrcAccessor::value_type>::RealPromote
571 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization);
573 Kernel1D<double> smooth_x, smooth_y;
574 smooth_x.initGaussian(scale_x);
575 smooth_x.setBorderTreatment(BORDER_TREATMENT_REFLECT);
576 smooth_y.initGaussian(scale_y);
577 smooth_y.setBorderTreatment(BORDER_TREATMENT_REFLECT);
580 destImage(tmp), kernel1d(smooth_x));
582 destIter(dupperleft, da), kernel1d(smooth_y));
585 template <
class SrcIterator,
class SrcAccessor,
586 class DestIterator,
class DestAccessor>
588 gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa,
589 DestIterator dupperleft, DestAccessor da,
597 template <
class SrcIterator,
class SrcAccessor,
598 class DestIterator,
class DestAccessor>
601 pair<DestIterator, DestAccessor> dest,
602 double scale_x,
double scale_y)
605 dest.first, dest.second, scale_x, scale_y);
608 template <
class SrcIterator,
class SrcAccessor,
609 class DestIterator,
class DestAccessor>
612 pair<DestIterator, DestAccessor> dest,
616 dest.first, dest.second, scale, scale);
701 template <
class SrcIterator,
class SrcAccessor,
702 class DestIteratorX,
class DestAccessorX,
703 class DestIteratorY,
class DestAccessorY>
705 SrcIterator slowerright, SrcAccessor sa,
706 DestIteratorX dupperleftx, DestAccessorX dax,
707 DestIteratorY dupperlefty, DestAccessorY day,
711 NumericTraits<typename SrcAccessor::value_type>::RealPromote
713 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization);
715 Kernel1D<double> smooth, grad;
716 smooth.initGaussian(scale);
717 grad.initGaussianDerivative(scale, 1);
720 destImage(tmp), kernel1d(grad));
722 destIter(dupperleftx, dax), kernel1d(smooth));
724 destImage(tmp), kernel1d(smooth));
726 destIter(dupperlefty, day), kernel1d(grad));
729 template <
class SrcIterator,
class SrcAccessor,
730 class DestIterator,
class DestAccessor>
732 SrcIterator slowerright, SrcAccessor src,
733 DestIterator dupperleft, DestAccessor dest,
736 VectorElementAccessor<DestAccessor> gradx(0, dest), grady(1, dest);
738 dupperleft, gradx, dupperleft, grady, scale);
741 template <
class SrcIterator,
class SrcAccessor,
742 class DestIteratorX,
class DestAccessorX,
743 class DestIteratorY,
class DestAccessorY>
746 pair<DestIteratorX, DestAccessorX> destx,
747 pair<DestIteratorY, DestAccessorY> desty,
751 destx.first, destx.second, desty.first, desty.second, scale);
754 template <
class SrcIterator,
class SrcAccessor,
755 class DestIterator,
class DestAccessor>
758 pair<DestIterator, DestAccessor> dest,
762 dest.first, dest.second, scale);
817 template <
class SrcIterator,
class SrcAccessor,
818 class DestIterator,
class DestAccessor>
820 SrcIterator slr, SrcAccessor src,
821 DestIterator dupperleft, DestAccessor dest,
824 typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
825 BasicImage<TmpType> gradx(slr-sul, SkipInitialization), grady(slr-sul, SkipInitialization);
828 destImage(gradx), destImage(grady), scale);
829 combineTwoImages(srcImageRange(gradx), srcImage(grady), destIter(dupperleft, dest),
830 MagnitudeFunctor<TmpType>());
833 template <
class SrcIterator,
class SrcAccessor,
834 class DestIterator,
class DestAccessor>
837 pair<DestIterator, DestAccessor> dest,
841 dest.first, dest.second, scale);
901 template <
class SrcIterator,
class SrcAccessor,
902 class DestIterator,
class DestAccessor>
904 SrcIterator slowerright, SrcAccessor sa,
905 DestIterator dupperleft, DestAccessor da,
909 NumericTraits<typename SrcAccessor::value_type>::RealPromote
911 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization),
912 tmpx(slowerright - supperleft, SkipInitialization),
913 tmpy(slowerright - supperleft, SkipInitialization);
915 Kernel1D<double> smooth, deriv;
916 smooth.initGaussian(scale);
917 deriv.initGaussianDerivative(scale, 2);
920 destImage(tmp), kernel1d(deriv));
922 destImage(tmpx), kernel1d(smooth));
924 destImage(tmp), kernel1d(smooth));
926 destImage(tmpy), kernel1d(deriv));
928 destIter(dupperleft, da), std::plus<TmpType>());
931 template <
class SrcIterator,
class SrcAccessor,
932 class DestIterator,
class DestAccessor>
935 pair<DestIterator, DestAccessor> dest,
939 dest.first, dest.second, scale);
1024 template <
class SrcIterator,
class SrcAccessor,
1025 class DestIteratorX,
class DestAccessorX,
1026 class DestIteratorXY,
class DestAccessorXY,
1027 class DestIteratorY,
class DestAccessorY>
1029 SrcIterator slowerright, SrcAccessor sa,
1030 DestIteratorX dupperleftx, DestAccessorX dax,
1031 DestIteratorXY dupperleftxy, DestAccessorXY daxy,
1032 DestIteratorY dupperlefty, DestAccessorY day,
1036 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1038 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization);
1040 Kernel1D<double> smooth, deriv1, deriv2;
1041 smooth.initGaussian(scale);
1042 deriv1.initGaussianDerivative(scale, 1);
1043 deriv2.initGaussianDerivative(scale, 2);
1046 destImage(tmp), kernel1d(deriv2));
1048 destIter(dupperleftx, dax), kernel1d(smooth));
1050 destImage(tmp), kernel1d(smooth));
1052 destIter(dupperlefty, day), kernel1d(deriv2));
1054 destImage(tmp), kernel1d(deriv1));
1056 destIter(dupperleftxy, daxy), kernel1d(deriv1));
1059 template <
class SrcIterator,
class SrcAccessor,
1060 class DestIteratorX,
class DestAccessorX,
1061 class DestIteratorXY,
class DestAccessorXY,
1062 class DestIteratorY,
class DestAccessorY>
1065 pair<DestIteratorX, DestAccessorX> destx,
1066 pair<DestIteratorXY, DestAccessorXY> destxy,
1067 pair<DestIteratorY, DestAccessorY> desty,
1071 destx.first, destx.second,
1072 destxy.first, destxy.second,
1073 desty.first, desty.second,
1189 template <
class SrcIterator,
class SrcAccessor,
1190 class DestIteratorX,
class DestAccessorX,
1191 class DestIteratorXY,
class DestAccessorXY,
1192 class DestIteratorY,
class DestAccessorY>
1194 SrcIterator slowerright, SrcAccessor sa,
1195 DestIteratorX dupperleftx, DestAccessorX dax,
1196 DestIteratorXY dupperleftxy, DestAccessorXY daxy,
1197 DestIteratorY dupperlefty, DestAccessorY day,
1198 double inner_scale,
double outer_scale)
1201 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1203 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization),
1204 tmpx(slowerright - supperleft, SkipInitialization),
1205 tmpy(slowerright - supperleft, SkipInitialization);
1208 destImage(tmpx), destImage(tmpy), inner_scale);
1210 destImage(tmp), std::multiplies<TmpType>());
1212 destIter(dupperleftx, dax), outer_scale);
1214 destImage(tmp), std::multiplies<TmpType>());
1216 destIter(dupperlefty, day), outer_scale);
1218 destImage(tmp), std::multiplies<TmpType>());
1220 destIter(dupperleftxy, daxy), outer_scale);
1223 template <
class SrcIterator,
class SrcAccessor,
1224 class DestIteratorX,
class DestAccessorX,
1225 class DestIteratorXY,
class DestAccessorXY,
1226 class DestIteratorY,
class DestAccessorY>
1229 pair<DestIteratorX, DestAccessorX> destx,
1230 pair<DestIteratorXY, DestAccessorXY> destxy,
1231 pair<DestIteratorY, DestAccessorY> desty,
1232 double inner_scale,
double outer_scale)
1235 destx.first, destx.second,
1236 destxy.first, destxy.second,
1237 desty.first, desty.second,
1238 inner_scale, outer_scale);
1243 template <
class SrcIterator,
class SrcAccessor,
1244 class DestIterator,
class DestAccessor>
1246 SrcIterator slowerright, SrcAccessor src,
1247 DestIterator dupperleft, DestAccessor dest,
1248 double inner_scale,
double outer_scale,
1251 typedef VectorElementAccessor<DestAccessor> DA;
1253 dupperleft, DA(0, dest),
1254 dupperleft, DA(1, dest),
1255 dupperleft, DA(2, dest),
1256 inner_scale, outer_scale);
1259 template <
class SrcIterator,
class SrcAccessor,
1260 class DestIterator,
class DestAccessor>
1262 SrcIterator slowerright, SrcAccessor src,
1263 DestIterator dupperleft, DestAccessor dest,
1264 double inner_scale,
double outer_scale,
1267 int bands = src.size(supperleft);
1268 typedef VectorElementAccessor<SrcAccessor> SA;
1272 inner_scale, outer_scale,
1275 BasicImage<typename DestAccessor::value_type> st(slowerright - supperleft, SkipInitialization);
1276 for(
int k=1; k < bands; ++k)
1279 st.upperLeft(), st.accessor(),
1280 inner_scale, outer_scale,
1282 combineTwoImages(srcImageRange(st), srcIter(dupperleft, dest), destIter(dupperleft, dest),
1283 std::plus<typename DestAccessor::value_type>());
1289 template <
class SrcIterator,
class SrcAccessor,
1290 class DestIterator,
class DestAccessor>
1292 SrcIterator slowerright, SrcAccessor src,
1293 DestIterator dupperleft, DestAccessor dest,
1294 double inner_scale,
double outer_scale)
1297 NumericTraits<typename SrcAccessor::value_type>::isScalar isScalar;
1298 detail::structureTensor(supperleft, slowerright, src,
1299 dupperleft, dest, inner_scale, outer_scale, isScalar());
1302 template <
class SrcIterator,
class SrcAccessor,
1303 class DestIterator,
class DestAccessor>
1306 pair<DestIterator, DestAccessor> dest,
1307 double inner_scale,
double outer_scale)
1310 dest.first, dest.second,
1311 inner_scale, outer_scale);
1318 #endif // VIGRA_CONVOLUTION_HXX