Hugin trunk 0.1
Loading...
Searching...
No Matches
ImageTransforms.h
Go to the documentation of this file.
1// -*- c-basic-offset: 4 -*-
27#ifndef _VIGRA_EXT_IMAGETRANSFORMS_H
28#define _VIGRA_EXT_IMAGETRANSFORMS_H
29
30#include <fstream>
31
32#include <vigra/basicimage.hxx>
33#include <vigra_ext/ROIImage.h>
35
37#include <hugin_utils/utils.h>
39
40namespace vigra_ext
41{
42
44template <class T>
46{
47 if (p < 0) {
48 return vigra::NumericTraits<T>::zero();
49 } else {
50 return p;
51 }
52}
53
55template <class T>
56vigra::RGBValue<T> zeroNegative(vigra::RGBValue<T> p)
57{
58 if (p.red() < 0) p.setRed(vigra::NumericTraits<T>::zero());
59 if (p.green() < 0) p.setGreen(vigra::NumericTraits<T>::zero());
60 if (p.blue() < 0) p.setBlue(vigra::NumericTraits<T>::zero());
61 return p;
62}
63
64
90template <class SrcImageIterator, class SrcAccessor,
92 class TRANSFORM,
93 class PixelTransform,
95 class Interpolator>
96void transformImageIntern(vigra::triple<SrcImageIterator, SrcImageIterator, SrcAccessor> src,
97 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor> dest,
98 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
99 TRANSFORM & transform,
101 vigra::Diff2D destUL,
103 bool warparound,
105 bool singleThreaded)
106{
107 const vigra::Diff2D destSize = dest.second - dest.first;
108
109 const int xstart = destUL.x;
110 const int xend = destUL.x + destSize.x;
111 const int ystart = destUL.y;
112 const int yend = destUL.y + destSize.y;
113
116
117 // loop over the image and transform
118#pragma omp parallel for if(!singleThreaded) schedule(dynamic)
119 for (int y = ystart; y < yend; ++y)
120 {
121 // create x iterators
123 xd.y += y - ystart;
124 AlphaImageIterator xdm(alpha.first);
125 xdm.y += y - ystart;
126 typename SrcAccessor::value_type tempval;
127 for (int x = xstart; x < xend; ++x, ++xd.x, ++xdm.x)
128 {
129 double sx, sy;
130 if (transform.transformImgCoord(sx, sy, x, y)) {
131 if (interpol.operator()(sx, sy, tempval)){
132 // apply pixel transform and write to output
134 alpha.second.set(pixelTransform.hdrWeight(tempval, vigra::UInt8(255)), xdm);
135 }
136 else {
137 alpha.second.set(0, xdm);
138 }
139 }
140 else {
141 alpha.second.set(0, xdm);
142 }
143 }
144 }
145}
146
148template <class SrcImageIterator, class SrcAccessor,
150 class DestImageIterator, class DestAccessor,
151 class TRANSFORM,
152 class PixelTransform,
154 class Interpolator>
155void transformImageAlphaIntern(vigra::triple<SrcImageIterator, SrcImageIterator, SrcAccessor> src,
156 std::pair<SrcAlphaIterator, SrcAlphaAccessor> srcAlpha,
157 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor> dest,
158 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
159 TRANSFORM & transform,
161 vigra::Diff2D destUL,
163 bool warparound,
165 bool singleThreaded)
166{
167 const vigra::Diff2D destSize = dest.second - dest.first;
168
169 const int xstart = destUL.x;
170 const int xend = destUL.x + destSize.x;
171 const int ystart = destUL.y;
172 const int yend = destUL.y + destSize.y;
173
177
178 // loop over the image and transform
179#pragma omp parallel for if(!singleThreaded) schedule(dynamic)
180 for(int y=ystart; y < yend; ++y)
181 {
182 // create x iterators
184 xd.y += y - ystart;
185 AlphaImageIterator xdist(alpha.first);
186 xdist.y += y - ystart;
187 typename SrcAccessor::value_type tempval;
188 typename SrcAlphaAccessor::value_type alphaval;
189 for (int x = xstart; x < xend; ++x, ++xd.x, ++xdist.x)
190 {
191 double sx,sy;
192 if (transform.transformImgCoord(sx,sy,x,y)) {
193 // try to interpolate.
194 if (interpol(sx, sy, tempval, alphaval)) {
196 alpha.second.set(pixelTransform.hdrWeight(tempval, alphaval), xdist);
197 } else {
198 // point outside of image or mask
199 alpha.second.set(0, xdist);
200 }
201 } else {
202 alpha.second.set(0, xdist);
203 }
204 }
205 }
206};
207
232template <class SrcImageIterator, class SrcAccessor,
233 class DestImageIterator, class DestAccessor,
235 class TRANSFORM,
236 class PixelTransform>
237void transformImage(vigra::triple<SrcImageIterator, SrcImageIterator, SrcAccessor> src,
238 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor> dest,
239 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
240 vigra::Diff2D destUL,
241 TRANSFORM & transform,
243 bool warparound,
246{
247 switch (interpol) {
248 case INTERP_CUBIC:
249 DEBUG_DEBUG("using cubic interpolator");
253 break;
254 case INTERP_SPLINE_16:
255 DEBUG_DEBUG("interpolator: spline16");
259 break;
260 case INTERP_SPLINE_36:
261 DEBUG_DEBUG("interpolator: spline36");
265 break;
266 case INTERP_SPLINE_64:
267 DEBUG_DEBUG("interpolator: spline64");
271 break;
272 case INTERP_SINC_256:
273 DEBUG_DEBUG("interpolator: sinc 256");
277 break;
278 case INTERP_BILINEAR:
282 break;
287 break;
288 case INTERP_SINC_1024:
292 break;
293 }
294}
295
297template <class SrcImageIterator, class SrcAccessor,
299 class DestImageIterator, class DestAccessor,
301 class TRANSFORM, class PixelTransform>
302void transformImageAlpha(vigra::triple<SrcImageIterator, SrcImageIterator, SrcAccessor> src,
303 std::pair<SrcAlphaIterator, SrcAlphaAccessor> srcAlpha,
304 vigra::triple<DestImageIterator, DestImageIterator, DestAccessor> dest,
305 std::pair<AlphaImageIterator, AlphaAccessor> alpha,
306 vigra::Diff2D destUL,
307 TRANSFORM & transform,
309 bool warparound,
312{
313 switch (interpol) {
314 case INTERP_CUBIC:
315 DEBUG_DEBUG("using cubic interpolator");
319 break;
320 case INTERP_SPLINE_16:
321 DEBUG_DEBUG("interpolator: spline16");
325 break;
326 case INTERP_SPLINE_36:
327 DEBUG_DEBUG("interpolator: spline36");
331 break;
332 case INTERP_SPLINE_64:
333 DEBUG_DEBUG("interpolator: spline64");
337 break;
338 case INTERP_SINC_256:
339 DEBUG_DEBUG("interpolator: sinc 256");
343 break;
344 case INTERP_BILINEAR:
348 break;
353 break;
354 case INTERP_SINC_1024:
358 break;
359 }
360}
361
362}; // namespace
363
364#endif // _VIGRA_EXT_IMAGETRANSFORMS_H
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
#define DEBUG_DEBUG(msg)
Definition utils.h:68
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 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
cubic interpolation
several classes to calculate interpolator weights,
sinc interpolation, with variable width
spline16 interpolation
spline36 interpolation
spline64 interpolation
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.
Definition threshold.h:41