From: Pablo d'A. <da...@us...> - 2006-02-05 14:48:54
|
Update of /cvsroot/hugin/hugin/src/include/vigra_ext In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6353/src/include/vigra_ext Modified Files: ImageTransforms.h Interpolators.h ROIImage.h VignettingCorrection.h Log Message: changed some image processing stuff Index: Interpolators.h =================================================================== RCS file: /cvsroot/hugin/hugin/src/include/vigra_ext/Interpolators.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Interpolators.h 6 Jan 2006 15:58:06 -0000 1.4 +++ Interpolators.h 5 Feb 2006 14:48:45 -0000 1.5 @@ -225,7 +225,9 @@ typename INTERPOLATOR> class ImageInterpolator { +public: typedef typename SrcAccessor::value_type PixelType; +private: typedef typename vigra::NumericTraits<PixelType>::RealPromote RealPixelType; SrcImageIterator m_sIter; @@ -237,7 +239,6 @@ INTERPOLATOR m_inter; public: - /** Construct interpolator for an given image */ ImageInterpolator(vigra::triple<SrcImageIterator, SrcImageIterator,SrcAccessor> const & src, INTERPOLATOR & inter, @@ -394,7 +395,9 @@ typename INTERPOLATOR> class ImageMaskInterpolator { +public: typedef typename SrcAccessor::value_type PixelType; +private: typedef typename vigra::NumericTraits<PixelType>::RealPromote RealPixelType; SrcImageIterator m_sIter; @@ -411,7 +414,7 @@ /** Construct interpolator for an given image */ ImageMaskInterpolator(vigra::triple<SrcImageIterator, SrcImageIterator,SrcAccessor> const & src, - std::pair<MaskIterator, MaskAccessor> const & mask, + std::pair<MaskIterator, MaskAccessor> mask, INTERPOLATOR & inter, bool warparound) : m_sIter(src.first), Index: VignettingCorrection.h =================================================================== RCS file: /cvsroot/hugin/hugin/src/include/vigra_ext/VignettingCorrection.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- VignettingCorrection.h 8 Jan 2006 15:11:44 -0000 1.3 +++ VignettingCorrection.h 5 Feb 2006 14:48:45 -0000 1.4 @@ -186,7 +186,7 @@ { double m_coeff[NTERMS]; - PolySqDistFunctor(double coeff[]) + PolySqDistFunctor(const std::vector<double> & coeff) { for (unsigned int i=0; i<NTERMS; i++) m_coeff[i] = coeff[i]; }; @@ -509,7 +509,7 @@ template <class ImgIter, class ImgAccessor, class DestIter, class DestAccessor> void radialVigCorrection(vigra::triple<ImgIter, ImgIter, ImgAccessor> srcImg, vigra::pair<DestIter, DestAccessor> destImg, double gamma, double gammaMaxVal, - double radCoeff[], double cx, double cy, bool division, + const std::vector<double> & radCoeff, FDiff2D center, bool division, typename vigra::NumericTraits<typename ImgAccessor::value_type>::RealPromote a, typename vigra::NumericTraits<typename ImgAccessor::value_type>::RealPromote b, bool dither) @@ -530,22 +530,22 @@ if (gamma == 1.0) { RnF Rf; if (division) { - applyRadialVigCorrectionDither(srcImg, destImg, cx, cy, + applyRadialVigCorrectionDither(srcImg, destImg, center.x, center.y, VigCorrDivFunctor<PT, RnF, PolyF, LTF>(Rf, poly, adjust), dither); } else { - applyRadialVigCorrectionDither(srcImg, destImg, cx, cy, + applyRadialVigCorrectionDither(srcImg, destImg, center.x, center.y, VigCorrAddFunctor<PT, RnF, PolyF, LTF>(Rf, poly, adjust), dither); } } else { GammaFunctor Rf(gamma, gammaMaxVal); if (division) { - applyRadialVigCorrectionDither(srcImg, destImg, cx, cy, + applyRadialVigCorrectionDither(srcImg, destImg, center.x, center.y, VigCorrDivFunctor<PT, GammaFunctor, PolyF, LTF>(Rf, poly, adjust), dither); } else { - applyRadialVigCorrectionDither(srcImg, destImg, cx, cy, + applyRadialVigCorrectionDither(srcImg, destImg, center.x, center.y, VigCorrAddFunctor<PT, GammaFunctor, PolyF, LTF>(Rf, poly, adjust), dither); } Index: ROIImage.h =================================================================== RCS file: /cvsroot/hugin/hugin/src/include/vigra_ext/ROIImage.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- ROIImage.h 11 Oct 2004 21:12:20 -0000 1.2 +++ ROIImage.h 5 Feb 2006 14:48:45 -0000 1.3 @@ -24,6 +24,9 @@ #ifndef _ROIIMAGE_H #define _ROIIMAGE_H +#include <common/utils.h> +#include <vigra/imageinfo.hxx> + namespace vigra_ext { @@ -369,7 +372,89 @@ img.maskAccessor()); } +#if 0 +template <class Image, class Mask, class Functor> +void inspectROIImages(std::vector<ROIImage<Image,Mask> *> imgs, Functor & f) +{ + int nImg = imgs.size(); + std::vector<typename Image::traverser> imgUL(nImg); + std::vector<typename Mask::traverser> maskUL(nImg); + std::vector<vigra::Rect2D> rois(nImg); + for (unsigned i=0; i < nImg; i++) { + imgs[i] = imgs->upperLeft(); + masks[i] = imgs->maskUpperLeft(); + rois[i] = imgs->boundingBox(); + } +} +#endif +/** function to inspect a variable number of images. + * + * They do not need to overlap, and will be only evaluated inside their ROI + * + */ +template <class ImgIter, class ImgAcc, class MaskIter, class MaskAcc, class Functor> +void inspectImagesIf(std::vector<ImgIter> imgs, + std::vector<MaskIter> masks, + std::vector<vigra::Rect2D> rois, + Functor & f) +{ + + typedef typename ImgIter::value_type PixelType; + typedef typename MaskIter::value_type MaskType; + + typedef typename ImgIter::row_iterator RowImgIter; + typedef typename MaskIter::row_iterator RowMaskIter; + + int nImg = imgs.size(); + + vigra_precondition(nImg > 1, "more than one image needed"); + + // get maximum roi + vigra::Rect2D maxRoi= rois[0]; + for (unsigned i=1; i < nImg; i++) { + maxRoi |= rois[i]; + } + // skip empty area on the top and right + for (int k=0; k < nImg; k++) { + imgs[k].first.x += maxRoi.left(); + imgs[k].first.y += maxRoi.top(); + masks[k].first.x += maxRoi.left(); + masks[k].first.y += maxRoi.top(); + } + + std::vector<RowImgIter> rowImgIter(nImg); + std::vector<RowMaskIter> rowMaskIter(nImg); + + vigra::Point2D p; + std::vector<PixelType> val(nImg); + std::vector<MaskType> mval(nImg); + for(p.y=maxRoi.top(); p.y < maxRoi.bottom(); ++p.y) + { + for (int k=0; k < nImg; k++) { + rowImgIter[k] = imgs[k].first.rowIterator(); + rowMaskIter[k] = masks[k].first.rowIterator(); + } + + for (p.x=maxRoi.left(); p.x < maxRoi.right(); ++p.x) { + for (int k=0; k < nImg; k++) { + if (rois[k].contains(p)) { + val[k] = *(rowImgIter[k]); + mval[k] = *(rowMaskIter[k]); + } else { + mval[k] = 0; + } + rowImgIter[k]++; + rowMaskIter[k]++; + } + f(val,mval); + } + for (int k=0; k < nImg; k++) { + ++(imgs[k].first.y); + ++(masks[k].first.y); + } + } +} } Index: ImageTransforms.h =================================================================== RCS file: /cvsroot/hugin/hugin/src/include/vigra_ext/ImageTransforms.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- ImageTransforms.h 8 Jan 2006 15:11:44 -0000 1.5 +++ ImageTransforms.h 5 Feb 2006 14:48:45 -0000 1.6 @@ -123,8 +123,10 @@ alpha.second.set(0, xdm); } } - if ((y-ystart)%(destSize.y/20) == 0) { - prog.setProgress(((double)y-ystart)/(yend-ystart)); + if (destSize.y > 100) { + if ((y-ystart)%(destSize.y/20) == 0) { + prog.setProgress(((double)y-ystart)/destSize.y); + } } } prog.popTask(); @@ -228,8 +230,10 @@ alpha.second.set(0, xdist); } } - if ((y-ystart)%(destSize.y/20) == 0) { - prog.setProgress(((double)y-ystart)/(yend-ystart)); + if (destSize.y > 100) { + if ((y-ystart)%(destSize.y/20) == 0) { + prog.setProgress(((double)y-ystart)/destSize.y); + } } } prog.popTask(); |