Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

convolve.h

Go to the documentation of this file.
00001 #ifndef convolve_h
00002 #define convolve_h
00003 
00004 
00005 #include "fl/image.h"
00006 #include "fl/matrix.h"
00007 #include "fl/point.h"
00008 
00009 #include <ostream>
00010 
00011 
00012 namespace fl
00013 {
00014   enum BorderMode  
00015   {
00016         Crop,  
00017         ZeroFill,  
00018         Boost,  
00019         UseZeros  
00020   };
00021 
00046   class Convolution : public Filter
00047   {
00048   public:
00049         virtual Image filter (const Image & image) = 0;  
00050         virtual double response (const Image & image, const Point & p) const = 0;  
00051 
00052         BorderMode mode;
00053   };
00054 
00055 
00056   // 2D Convolutions ----------------------------------------------------------
00057 
00061   class ConvolutionDiscrete2D : public Convolution, public Image
00062   {
00063   public:
00064         ConvolutionDiscrete2D (const BorderMode mode = Crop,
00065                                                    const PixelFormat & format = GrayFloat);
00066         ConvolutionDiscrete2D (const Image & image, const BorderMode mode = Crop);
00067 
00068         virtual Image filter (const Image & image);
00069         virtual double response (const Image & image, const Point & p) const;  
00070 
00071         void normalFloats ();  
00072   };
00073 
00074   class Gaussian2D : public ConvolutionDiscrete2D
00075   {
00076   public:
00077         Gaussian2D (double sigma = 1.0,
00078                                 const BorderMode mode = Crop,
00079                                 const PixelFormat & format = GrayFloat);
00080 
00081         static double cutoff;  
00082   };
00083 
00084   class DifferenceOfGaussians : public ConvolutionDiscrete2D
00085   {
00086   public:
00087         DifferenceOfGaussians (double sigmaPlus,
00088                                                    double sigmaMinus,
00089                                                    const BorderMode mode = Crop,
00090                                                    const PixelFormat & format = GrayFloat);
00091   };
00092 
00093   class GaussianDerivativeFirst : public ConvolutionDiscrete2D
00094   {
00095   public:
00096         GaussianDerivativeFirst (int xy = 0,  
00097                                                          double sigmaX = 1.0,
00098                                                          double sigmaY = -1.0,
00099                                                          double angle = 0,
00100                                                          const BorderMode mode = Crop,
00101                                                          const PixelFormat & format = GrayFloat);
00102   };
00103 
00104   class GaussianDerivativeSecond : public ConvolutionDiscrete2D
00105   {
00106   public:
00107         GaussianDerivativeSecond (int xy1 = 0,
00108                                                           int xy2 = 0,
00109                                                           double sigmaX = 1.0,
00110                                                           double sigmaY = -1.0,
00111                                                           double angle = 0,
00112                                                           const BorderMode mode = Crop,
00113                                                           const PixelFormat & format = GrayFloat);
00114   };
00115 
00116   class GaussianDerivativeThird : public ConvolutionDiscrete2D
00117   {
00118   public:
00119         GaussianDerivativeThird (int xy1 = 0,
00120                                                          int xy2 = 0,
00121                                                          int xy3 = 0,
00122                                                          double sigmaX = 1.0,
00123                                                          double sigmaY = -1.0,
00124                                                          double angle = 0,
00125                                                          const BorderMode mode = Crop,
00126                                                          const PixelFormat & format = GrayFloat);
00127   };
00128 
00129   class Laplacian : public ConvolutionDiscrete2D
00130   {
00131   public:
00132         Laplacian (double sigma = 1.0,
00133                            const BorderMode mode = Crop,
00134                            const PixelFormat & format = GrayFloat);
00135 
00136         double sigma;
00137   };
00138 
00139 
00140   // 1D Convolutions ----------------------------------------------------------
00141 
00142   enum Direction
00143   {
00144         Vertical,
00145         Horizontal
00146   };
00147 
00148   class Convolution1D : public Convolution
00149   {
00150   public:
00151         Direction direction;
00152   };
00153 
00154   class ConvolutionDiscrete1D : public Convolution1D, public Image
00155   {
00156   public:
00157         ConvolutionDiscrete1D (const BorderMode mode = Crop,
00158                                                    const PixelFormat & format = GrayFloat,
00159                                                    const Direction direction = Horizontal);
00160         ConvolutionDiscrete1D (const Image & image,
00161                                                    const BorderMode mode = Crop,
00162                                                    const Direction direction = Horizontal);
00163 
00164         virtual Image filter (const Image & image);
00165         virtual double response (const Image & image, const Point & p) const;  
00166 
00167         void normalFloats ();  
00168   };
00169 
00170   class Gaussian1D : public ConvolutionDiscrete1D
00171   {
00172   public:
00173         Gaussian1D (double sigma = 1.0,
00174                                 const BorderMode mode = Crop,
00175                                 const PixelFormat & format = GrayFloat,
00176                                 const Direction direction = Horizontal);
00177   };
00178 
00179   class GaussianDerivative1D : public ConvolutionDiscrete1D
00180   {
00181   public:
00182         GaussianDerivative1D (double sigma = 1.0,
00183                                                   const BorderMode mode = Crop,
00184                                                   const PixelFormat & format = GrayFloat,
00185                                                   const Direction direction = Horizontal);
00186   };
00187 
00188   class GaussianDerivativeSecond1D : public ConvolutionDiscrete1D
00189   {
00190   public:
00191         GaussianDerivativeSecond1D (double sigma = 1.0,
00192                                                                 const BorderMode mode = Crop,
00193                                                                 const PixelFormat & format = GrayFloat,
00194                                                                 const Direction direction = Horizontal);
00195   };
00196 
00203   class ConvolutionRecursive1D : public Convolution1D
00204   {
00205   public:
00206         virtual Image filter (const Image & image);
00207         virtual double response (const Image & image, const Point & p) const;
00208 
00209         void set_nii_and_dii (double sigma,
00210                                                   double a0, double a1,
00211                                                   double b0, double b1,
00212                                                   double c0, double c1,
00213                                                   double o0, double o1);
00214 
00215         // Coefficients:
00216         double n00p;
00217         double n11p;
00218         double n22p;
00219         double n33p;
00220         double n11m;
00221         double n22m;
00222         double n33m;
00223         double n44m;
00224         double d11p;
00225         double d22p;
00226         double d33p;
00227         double d44p;
00228         double d11m;
00229         double d22m;
00230         double d33m;
00231         double d44m;
00232         double scale;
00233   };
00234 
00235   class GaussianRecursive1D : public ConvolutionRecursive1D
00236   {
00237   public:
00238         GaussianRecursive1D (double sigma = 1.0,
00239                                                  const Direction direction = Horizontal);
00240   };
00241 
00242   class GaussianDerivativeRecursive1D : public ConvolutionRecursive1D
00243   {
00244   public:
00245         GaussianDerivativeRecursive1D (double sigma = 1.0,
00246                                                                    const Direction direction = Horizontal);
00247   };
00248 
00249   class GaussianDerivativeSecondRecursive1D : public ConvolutionRecursive1D
00250   {
00251   public:
00252         GaussianDerivativeSecondRecursive1D (double sigma = 1.0,
00253                                                                                  const Direction direction = Horizontal);
00254   };
00255 
00256 
00257   // Interest operators -------------------------------------------------------
00258 
00259   class FilterHarris : public Filter
00260   {
00261   public:
00262         FilterHarris (double sigmaD = 1.0, double sigmaI = 1.4, const PixelFormat & format = GrayFloat);
00263 
00264         virtual Image filter (const Image & image);  
00265         virtual void preprocess (const Image & image);  
00266         virtual Image process ();  
00267         virtual double response (int x, int y) const;  
00268         virtual void gradientSquared (int x, int y, Matrix<double> & result) const;  
00269 
00270         double sigmaD;  
00271         double sigmaI;  
00272         Gaussian2D           G_I;   
00273         Gaussian1D           G1_I;  
00274         Gaussian1D           G1_D;  
00275         GaussianDerivative1D dG_D;  
00276         Image xx;  
00277         Image xy;  
00278         Image yy;
00279         int offset;   
00280         int offsetI;  
00281         int offsetD;  
00282 
00283         static const double alpha;
00284 
00285   protected:
00292         int offset1;
00293         int offset2;
00294   };
00295 
00301   class FilterHarrisEigen : public FilterHarris
00302   {
00303   public:
00304         FilterHarrisEigen (double sigmaD = 1.0, double sigmaI = 1.4, const PixelFormat & format = GrayFloat) : FilterHarris (sigmaD, sigmaI, format) {}
00305 
00306         virtual Image process ();
00307         virtual double response (const int x, const int y) const;
00308   };
00309 
00313   class FilterHessian : public Filter
00314   {
00315   public:
00316         FilterHessian (double sigma = 1.0, const PixelFormat & format = GrayFloat);
00317 
00318         virtual Image filter (const Image & image);
00319 
00320         double sigma;  
00321         Gaussian1D                 G;
00322         GaussianDerivativeSecond1D dG;
00323         int offset;  
00324 
00325   protected:
00326         int offset1;
00327         int offset2;
00328   };
00329 
00330 
00331   // Misc -----------------------------------------------------------------------
00332 
00341   class FiniteDifferenceX : public Filter
00342   {
00343   public:
00344         virtual Image filter (const Image & image);     
00345   };
00346 
00350   class FiniteDifferenceY : public Filter
00351   {
00352   public:
00353         virtual Image filter (const Image & image);     
00354   };
00355 
00356   class NonMaxSuppress : public Filter
00357   {
00358   public:
00359         NonMaxSuppress (int half = 1, BorderMode mode = UseZeros);  
00360 
00361         virtual Image filter (const Image & image);
00362 
00363         int half;  
00364         BorderMode mode;
00365         float maximum;  
00366         float minimum;  
00367         float average;  
00368         int count;  
00369   };
00370 
00375   class IntensityAverage : public Filter
00376   {
00377   public:
00378         IntensityAverage (bool ignoreZeros = false);
00379 
00380         virtual Image filter (const Image & image);
00381 
00382         float average;  
00383         float minimum;  
00384         float maximum;  
00385         int count;      
00386         bool ignoreZeros;  
00387   };
00388 
00393   class IntensityDeviation : public Filter
00394   {
00395   public:
00396         IntensityDeviation (float average, bool ignoreZeros = false);
00397 
00398         virtual Image filter (const Image & image);
00399 
00400         float average;  
00401         float deviation;  
00402         bool ignoreZeros;  
00403   };
00404 
00409   class IntensityHistogram : public Filter
00410   {
00411   public:
00412         IntensityHistogram (const std::vector<float> & ranges);
00413         IntensityHistogram (float minimum, float maximum, int bins);
00414 
00415         virtual Image filter (const Image & image);
00416 
00417         int total () const;  
00418         void dump (std::ostream & stream, bool center = false, bool percent = false) const;  
00419 
00420         std::vector<float> ranges;  
00421         std::vector<int>   counts;  
00422   };
00423 
00427   class Normalize : public Filter
00428   {
00429   public:
00430         Normalize (double length = 1);
00431 
00432         virtual Image filter (const Image & image);
00433 
00434         double length;
00435   };
00436 
00440   class AbsoluteValue : public Filter
00441   {
00442   public:
00443         virtual Image filter (const Image & image);
00444   };
00445 
00451   class Rescale : public Filter
00452   {
00453   public:
00454         Rescale (double a = 1.0, double b = 0);
00455         Rescale (const Image & image, bool useFullRange = true);  
00456         virtual Image filter (const Image & image);
00457 
00458         double a;
00459         double b;
00460   };
00461 
00462   class Transform : public Filter
00463   {
00464   public:
00465         Transform (const Matrix<double> & A, bool inverse = false);  
00466         Transform (const Matrix<double> & A, const double scale);  
00467         Transform (double angle);
00468         Transform (double scaleX, double scaleY);
00469         void initialize (const Matrix<double> & A, bool inverse = false);  
00470 
00471         virtual Image filter (const Image & image);
00472 
00473         void setPeg (float centerX = -1, float centerY = -1, int width = -1, int height = -1);  
00474         void setWindow (float centerX, float centerY, int width = -1, int height = -1);  
00475         void prepareResult (const Image & image, Image & result, Matrix3x3<float> & H);  
00476         Transform operator * (const Transform & that) const;
00477 
00478         //Matrix3x3<float> A;  ///< Maps coordinates from input image to output image.
00479         //Matrix3x3<float> IA;  ///< Inverse of A.  Maps coordinates from output image back to input image.
00480         //bool inverse;  ///< Indicates whether the matrix given to the constructor was A or IA.
00481 
00482         Matrix2x2<float> IA;  
00483         float translateX;
00484         float translateY;
00485 
00486         bool peg;  
00487         bool defaultViewport;  
00488         float centerX;
00489         float centerY;
00490         int width;
00491         int height;
00492   };
00493 
00494   class TransformGauss : public Transform
00495   {
00496   public:
00497         TransformGauss (const Matrix<double> & A, bool inverse = false) : Transform (A, inverse), G (GrayFloat) {needG = true;}
00498         TransformGauss (const Matrix<double> & A, const double scale) : Transform (A, scale), G (GrayFloat) {needG = true;}
00499         TransformGauss (double angle) : Transform (angle), G (GrayFloat) {needG = true;}
00500         TransformGauss (double scaleX, double scaleY) : Transform (scaleX, scaleY), G (GrayFloat) {needG = true;}
00501         TransformGauss (const Transform & that) : Transform (that), G (GrayFloat) {needG = true;}
00502         void prepareG ();
00503 
00504         virtual Image filter (const Image & image);
00505 
00506         ImageOf<float> G;  
00507         int Gshw;  
00508         int Gshh;  
00509         int GstepX;  
00510         int GstepY;
00511         float sigmaX;  
00512         float sigmaY;
00513         bool needG;  
00514   };
00515 
00520   class Zoom : public Filter
00521   {
00522   public:
00523         Zoom (int scaleX, int scaleY);
00524 
00525         virtual Image filter (const Image & image);
00526 
00527         int scaleX;
00528         int scaleY;
00529   };
00530 
00531   class Rotate180 : public Filter
00532   {
00533   public:
00534         virtual Image filter (const Image & image);
00535   };
00536 
00537   class Rotate90 : public Filter
00538   {
00539   public:
00540         Rotate90 (bool clockwise = false);  
00541 
00542         virtual Image filter (const Image & image);
00543 
00544         bool clockwise;
00545   };
00546 
00547   class ClearAlpha : public Filter
00548   {
00549   public:
00550         ClearAlpha (unsigned int color = 0x0);
00551 
00552         virtual Image filter (const Image & image);
00553 
00554         unsigned int color;
00555   };
00556 }
00557 
00558 
00559 #endif

Generated on Thu Dec 9 17:13:24 2004 for fl by doxygen1.2.18