1 #ifndef CVD_IMAGE_INTERPOLATE_H 2 #define CVD_IMAGE_INTERPOLATE_H 6 #include <cvd/internal/pixel_operations.h> 7 #include <cvd/internal/rgb_components.h> 8 #include <cvd/vector_image_ref.h> 66 #ifdef DOXYGEN_INCLUDE_ONLY_FOR_DOCS 67 template <
class I,
class P>
82 bool in_image(
const TooN::Vector<2>& pos)
const;
87 float_type operator[](
const TooN::Vector<2>& pos)
const;
90 TooN::Vector<2> min()
const;
92 TooN::Vector<2> max()
const;
96 #ifndef DOXYGEN_IGNORE_INTERNAL 98 template <
class I,
class C>
109 int round(
double d)
const 112 return (
int)ceil(d - .5);
114 return (
int)floor(d + .5);
117 ImageRef to_ir(
const TooN::Vector<2>& v)
const 119 return ImageRef(round(v[0]), round(v[1]));
122 typedef typename Pixel::traits<C>::float_type FT;
130 bool in_image(
const TooN::Vector<2>& pos)
const 132 return im->in_image(to_ir(pos));
135 FT operator[](
const TooN::Vector<2>& pos)
const 137 return (*im)[to_ir(pos)];
140 TooN::Vector<2> min()
const 142 return TooN::makeVector(0, 0);
145 TooN::Vector<2> max()
const 157 TooN::Vector<2> floor(
const TooN::Vector<2>& v)
const 159 return TooN::makeVector(::floor(v[0]), ::floor(v[1]));
162 TooN::Vector<2> ceil(
const TooN::Vector<2>& v)
const 164 return TooN::makeVector(::ceil(v[0]), ::ceil(v[1]));
167 typedef typename Pixel::traits<T>::float_type FT;
175 bool in_image(
const TooN::Vector<2>& pos)
const 177 return im->in_image(
ir(floor(pos))) && im->in_image(
ir(ceil(pos)));
180 FT operator[](
const TooN::Vector<2>& pos)
const 182 TooN::Vector<2> delta = pos - floor(pos);
191 for(
unsigned int i = 0; i < Pixel::Component<T>::count; i++)
193 float a, b = 0, c = 0, d = 0;
212 TooN::Vector<2> min()
const 214 return TooN::makeVector(0, 0);
217 TooN::Vector<2> max()
const 229 float p(
float f)
const 231 return f < 0 ? 0 : f;
234 float r(
float x)
const 236 return (pow(p(x + 2), 3) - 4 * pow(p(x + 1), 3) + 6 * pow(p(x), 3) - 4 * pow(p(x - 1), 3)) / 6;
239 typedef typename Pixel::traits<T>::float_type FT;
247 bool in_image(
const TooN::Vector<2>& pos)
const 249 return pos[0] >= 1 && pos[1] >= 1 && pos[0] < im->
size().x - 2 && pos[1] < im->
size().y - 2;
252 FT operator[](
const TooN::Vector<2>& pos)
const 254 int x = (int)floor(pos[0]);
255 int y = (int)floor(pos[1]);
256 float dx = pos[0] - x;
257 float dy = pos[1] - y;
261 for(
unsigned int i = 0; i < Pixel::Component<T>::count; i++)
265 for(
int m = -1; m < 3; m++)
266 for(
int n = -1; n < 3; n++)
275 TooN::Vector<2> min()
const 277 return TooN::makeVector(1, 1);
280 TooN::Vector<2> max()
const 282 return TooN::makeVector(im->
size().x - 2, im->
size().y - 2);
ImageRef ir(const TooN::Vector< 2 > &v)
Convert a Vector into an image co-ordinate.
Definition: vector_image_ref.h:24
All classes and functions are within the CVD namespace.
Definition: argb.h:6
ImageRef size() const
What is the size of this image?
Definition: image.h:557
Definition: image_interpolate.h:99
TooN::Vector< 2 > vec(const ImageRef &ir)
Convert an image co-ordinate into a Vector.
Definition: vector_image_ref.h:13
This does not interpolate: it uses the nearest neighbour.
Definition: image_interpolate.h:24
This class is for bicubic (not bicubic spline) interpolation.
Definition: image_interpolate.h:61
Definition: image_ref.h:29
This class is for bilinear interpolation.
Definition: image_interpolate.h:45
A generic image class to manage a block of arbitrarily padded data as an image.
Definition: image.h:273
Definition: builtin_components.h:38