27#ifndef _VIGRA_EXT_IMAGETRANSFORMS_H
28#define _VIGRA_EXT_IMAGETRANSFORMS_H
32#include <vigra/basicimage.hxx>
49 return vigra::NumericTraits<T>::zero();
59 if (p.red() < 0) p.setRed(vigra::NumericTraits<T>::zero());
60 if (p.green() < 0) p.setGreen(vigra::NumericTraits<T>::zero());
61 if (p.blue() < 0) p.setBlue(vigra::NumericTraits<T>::zero());
98 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor>
dest,
99 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
119#pragma omp parallel for if(!singleThreaded) schedule(dynamic)
127 typename SrcAccessor::value_type
tempval;
131 if (transform.transformImgCoord(
sx,
sy, x, y)) {
138 alpha.second.set(0,
xdm);
142 alpha.second.set(0,
xdm);
157 std::pair<SrcAlphaIterator, SrcAlphaAccessor>
srcAlpha,
158 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor>
dest,
159 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
180#pragma omp parallel for if(!singleThreaded) schedule(dynamic)
188 typename SrcAccessor::value_type
tempval;
189 typename SrcAlphaAccessor::value_type
alphaval;
193 if (transform.transformImgCoord(
sx,
sy,x,y)) {
200 alpha.second.set(0,
xdist);
203 alpha.second.set(0,
xdist);
217 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor>
dest,
218 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
234 typedef typename vigra::NumericTraits<typename SrcImageIterator::value_type>::RealPromote
RealAccessor;
237 std::cout <<
"MaxLevels=" <<
maxLevel << std::endl;
239 std::vector<vigra::BasicImage<typename SrcImageIterator::value_type>>
pyramids(
maxLevel);
240 std::vector<hugin_utils::FDiff2D>
scales;
241 size_t w = (
src.second -
src.first).x;
242 size_t h = (
src.second -
src.first).y;
246 std::vector<vigra_ext::ImageInterpolator<SrcImageIterator, SrcAccessor, Interpolator>>
interpolators;
275#pragma omp parallel for if(!singleThreaded) schedule(dynamic)
283 typename SrcAccessor::value_type
tempval;
291 if (transform.transformImgCoord(
sx,
sy, x, y))
307 if (transform.transformImgCoord(
sxy,
syy, x, y - 1))
313 if (transform.transformImgCoord(
sxy,
syy, x, y + 1))
318 const double fullLevel = std::max<double>(std::min<double>(std::log2(scale) - 1,
maxLevel), 0.0);
322 std::cout <<
"Using level " << level << std::endl;
341 typename SrcAccessor::value_type
tempval2;
353 alpha.second.set(0,
xdm);
361 alpha.second.set(0,
xdm);
377 std::pair<SrcAlphaIterator, SrcAlphaAccessor>
srcAlpha,
378 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor>
dest,
379 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
395 typedef typename vigra::NumericTraits<typename SrcImageIterator::value_type>::RealPromote
RealAccessor;
396 typedef typename vigra::NumericTraits<typename SrcAlphaIterator::value_type>::Promote
RealAlphaAccessor;
399 std::cout <<
"MaxLevels=" <<
maxLevel << std::endl;
401 typedef vigra::BasicImage<typename SrcImageIterator::value_type>
PyramidImageType;
404 std::vector<hugin_utils::FDiff2D>
scales;
405 size_t w = (
src.second -
src.first).x;
406 size_t h = (
src.second -
src.first).y;
409 std::cout <<
"(Alpha) Initial size " <<
w <<
"x" << h <<
", max level=" <<
maxLevel << std::endl;
411 std::vector<vigra_ext::ImageMaskInterpolator<SrcImageIterator, SrcAccessor, SrcAlphaIterator, SrcAlphaAccessor, Interpolator>>
interpolators;
425 enblend::reduce<RealAccessor, RealAlphaAccessor>(
warparound,
src.first,
src.second,
src.third,
448#pragma omp parallel for if(!singleThreaded) schedule(dynamic)
456 typename SrcAccessor::value_type
tempval;
457 typename SrcAlphaAccessor::value_type
alphaval;
465 if (transform.transformImgCoord(
sx,
sy, x, y))
481 if (transform.transformImgCoord(
sxy,
syy, x, y - 1))
487 if (transform.transformImgCoord(
sxy,
syy, x, y + 1))
492 const double fullLevel = std::max<double>(std::min<double>(std::log2(scale) - 1,
maxLevel), 0.0);
496 std::cout <<
"Using level " << level << std::endl;
515 typename SrcAccessor::value_type
tempval2;
516 typename SrcAlphaAccessor::value_type
alphaval2;
529 alpha.second.set(0,
xdist);
537 alpha.second.set(0,
xdist);
574 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor>
dest,
575 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
630 std::cout <<
"TransformImage AA, nearest" << std::endl;
636 std::cout <<
"TransformImage AA, bilinear" << std::endl;
642 std::cout <<
"TransformImage AA, cubic" << std::endl;
648 std::cout <<
"TransformImage AA, Lanzcos" << std::endl;
663 std::pair<SrcAlphaIterator, SrcAlphaAccessor>
srcAlpha,
664 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor>
dest,
665 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
720 std::cout <<
"TransformImage alpha AA, nearest" << std::endl;
726 std::cout <<
"TransformImage alpha AA, linear" << std::endl;
732 std::cout <<
"TransformImage alpha AA, cubic" << std::endl;
738 std::cout <<
"TransformImage alpha AA, Lanzcos" << std::endl;
The pano tools interpolators ported to vigra.
"wrapper" for efficient interpolation access to an image
"wrapper" for efficient interpolation access to an image
misc math function & classes used by other parts of the program
void transformImage(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, vigra::Diff2D destUL, TRANSFORM &transform, PixelTransform &pixelTransform, bool warparound, Interpolator interpol, AppBase::ProgressDisplay *progress, bool singleThreaded=false)
Transform an image into the panorama.
T zeroNegative(T p)
Set negative elements of a pixel to zero.
void transformImageInternAA(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, TRANSFORM &transform, PixelTransform &pixelTransform, vigra::Diff2D destUL, Interpolator interp, bool warparound, AppBase::ProgressDisplay *progress, bool singleThreaded)
Transform an image into the panorama using anti-aliasing.
void transformImageAlphaInternAA(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, std::pair< SrcAlphaIterator, SrcAlphaAccessor > srcAlpha, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, TRANSFORM &transform, PixelTransform &pixelTransform, vigra::Diff2D destUL, Interpolator interp, bool warparound, AppBase::ProgressDisplay *progress, bool singleThreaded)
transform input images with alpha channel with anti-aliasing
void transformImageAlpha(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, std::pair< SrcAlphaIterator, SrcAlphaAccessor > srcAlpha, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, vigra::Diff2D destUL, TRANSFORM &transform, PixelTransform &pixelTransform, bool warparound, Interpolator interpol, AppBase::ProgressDisplay *progress, bool singleThreaded=false)
Transform image, and respect a possible alpha channel.
void transformImageAlphaIntern(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, std::pair< SrcAlphaIterator, SrcAlphaAccessor > srcAlpha, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, TRANSFORM &transform, PixelTransform &pixelTransform, vigra::Diff2D destUL, Interpolator interp, bool warparound, AppBase::ProgressDisplay *progress, bool singleThreaded)
transform input images with alpha channel
Interpolator
enum with all interpolation methods
@ INTERP_NEAREST_NEIGHBOUR
void transformImageIntern(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, TRANSFORM &transform, PixelTransform &pixelTransform, vigra::Diff2D destUL, Interpolator interp, bool warparound, AppBase::ProgressDisplay *progress, bool singleThreaded)
Transform an image into the panorama.
simple bilinear interpolation
several classes to calculate interpolator weights,
sinc interpolation, with variable width
std::vector< deghosting::BImagePtr > threshold(const std::vector< deghosting::FImagePtr > &inputImages, const double threshold, const uint16_t flags)
Threshold function used for creating alpha masks for images.