libcvd-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libcvd-members] libcvd/cvd image_interpolate.h


From: Edward Rosten
Subject: [libcvd-members] libcvd/cvd image_interpolate.h
Date: Wed, 17 Jan 2007 03:03:35 +0000

CVSROOT:        /cvsroot/libcvd
Module name:    libcvd
Changes by:     Edward Rosten <edrosten>        07/01/17 03:03:35

Modified files:
        cvd            : image_interpolate.h 

Log message:
        Bilinear interpolation now does not attempt to access outside the image 
when 
        its up against an edge.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/libcvd/cvd/image_interpolate.h?cvsroot=libcvd&r1=1.14&r2=1.15

Patches:
Index: image_interpolate.h
===================================================================
RCS file: /cvsroot/libcvd/libcvd/cvd/image_interpolate.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- image_interpolate.h 1 Aug 2006 15:41:55 -0000       1.14
+++ image_interpolate.h 17 Jan 2007 03:03:35 -0000      1.15
@@ -150,6 +150,11 @@
                                return (TooN::make_Vector, ::floor(v[0]), 
::floor(v[1]));
                        }
 
+                       TooN::Vector<2> ceil(const TooN::Vector<2>& v)
+                       {
+                               return (TooN::make_Vector, ::ceil(v[0]), 
::ceil(v[1]));
+                       }
+
                        typedef typename Pixel::traits<T>::float_type FT;
 
                public:
@@ -159,7 +164,7 @@
 
                        bool in_image(const TooN::Vector<2>& pos)
                        {
-                               return im->in_image(ir(floor(pos)));
+                               return im->in_image(ir(floor(pos))) && 
im->in_image(ir(ceil(pos)));
                        }
 
                        FT operator[](const TooN::Vector<2>& pos)
@@ -168,10 +173,6 @@
 
                                ImageRef p = ir(floor(pos));
 
-                               if(delta[0] == 0 && delta[1] == 0)
-                                       return (*im)[p];
-                               else
-                               {       
                                        double x = delta[0];
                                        double y = delta[1];
 
@@ -179,19 +180,24 @@
 
                                        for(unsigned int i=0; i < 
Pixel::Component<T>::count; i++)
                                        {
-                                               float a, b, c, d;
+                                       float a, b=0, c=0, d=0;
 
-                                               a = 
Pixel::Component<T>::get((*im)[p + ImageRef(0,0)], i);
-                                               b = 
Pixel::Component<T>::get((*im)[p + ImageRef(1,0)], i);
-                                               c = 
Pixel::Component<T>::get((*im)[p + ImageRef(0,1)], i);
-                                               d = 
Pixel::Component<T>::get((*im)[p + ImageRef(1,1)], i);
+                                       a = Pixel::Component<T>::get((*im)[p + 
ImageRef(0,0)], i) * (1-x) * (1-y);
                                                
-                                               Pixel::Component<FT>::get(ret, 
i) = ((a*(1-x) + b*x)*(1-y) + (c*(1-x) + d*x)*y);
+                                       if(x != 0)
+                                               b = 
Pixel::Component<T>::get((*im)[p + ImageRef(1,0)], i) * x * (1-y);
+                                       
+                                       if(y != 0)
+                                       c = Pixel::Component<T>::get((*im)[p + 
ImageRef(0,1)], i) * (1-x) * y;
+
+                                       if(x !=0 && y != 0)
+                                               d = 
Pixel::Component<T>::get((*im)[p + ImageRef(1,1)], i) * x * y;
+                                       
+                                       Pixel::Component<FT>::get(ret, i) = a + 
b + c + d;
                                        }
 
                                        return ret;
                                }
-                       }
 
                        TooN::Vector<2> min()
                        {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]