00001 #ifndef gevd_float_operators_h_
00002 #define gevd_float_operators_h_
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 class gevd_bufferxy;       
00041 
00042 class gevd_float_operators
00043 {
00044 
00045   gevd_float_operators();
00046 
00047  public:
00048   
00049   static float Convolve(const gevd_bufferxy& from, const gevd_bufferxy& kernel,
00050                         gevd_bufferxy*& to);
00051   static gevd_bufferxy* Read2dKernel(const char* filename);
00052   static float Convolve(const gevd_bufferxy& from, gevd_bufferxy*& to,
00053                         const float* xkernel, 
00054                         const int xradius, const bool xevenp,
00055                         const float* ykernel,
00056                         const int yradius, const bool yevenp,
00057                         const bool xwrap=false, const bool ywrap=false);
00058   static float Convolve(const gevd_bufferxy& from, gevd_bufferxy*& to,
00059                         const float* xkernel, 
00060                         const int xradius, const bool xevenp,
00061                         const int yradius,    
00062                         const bool xwrap=false, const bool ywrap=false);
00063   static float Convolve(const float* from, float*& to, const int len,
00064                         const float* kernel, const int radius,
00065                         const bool evenp, const bool wrap=false);
00066   static float RunningSum(float* from, float*& to, const int len,
00067                           const int radius, const bool wrap=false);
00068   static bool Read1dKernel(const char* filename,
00069                            float*& kernel, int& radius, bool& evenp);
00070 
00071   static float Gaussian(gevd_bufferxy& img, gevd_bufferxy*& smooth, const float sigma=1.0f,
00072                         const bool xwrap=false, const bool ywrap=false);
00073   static bool Find1dGaussianKernel(const float sigma,
00074                                    float*& kernel, int& radius,
00075                                    const float fuzz=0.02f);
00076 
00077   
00078   static float Gradient(const gevd_bufferxy& smooth, 
00079                         gevd_bufferxy*& mag,
00080                         gevd_bufferxy*& dirx, gevd_bufferxy*& diry,
00081                         const bool xwrap=false, const bool ywrap=false);
00082   static float Slope(float* from, float*& to, const int len,
00083                      const bool wrap=false);
00084   static float Hessian(const gevd_bufferxy& smooth, 
00085                        gevd_bufferxy*& mag, 
00086                        gevd_bufferxy*& dirx, gevd_bufferxy*& diry,
00087                        const bool xwrap=false, const bool ywrap=false);
00088   static float Laplacian(const gevd_bufferxy& smooth,
00089                          gevd_bufferxy*& mag, 
00090                          gevd_bufferxy*& dirx, gevd_bufferxy*& diry,
00091                          const bool xwrap=false, const bool ywrap=false);
00092   static float Curvature(float* from, float*& to, const int len,
00093                          const bool wrap=false);
00094   static float Orientation(const gevd_bufferxy& smooth,
00095                            gevd_bufferxy*& theta,  gevd_bufferxy*& coherence,
00096                            const int frame=1);
00097 
00098   static void NonMaximumSuppression(const gevd_bufferxy& magnitude,
00099                                     const gevd_bufferxy& directionx,
00100                                     const gevd_bufferxy& directiony,
00101                                     const float threshold,
00102                                     gevd_bufferxy*& contour, gevd_bufferxy*& direction,
00103                                     gevd_bufferxy*& locationx, gevd_bufferxy*& locationy,
00104                                     const bool xwrap=false,
00105                                     const bool ywrap=false);
00106   static int NonMaximumSuppression(const float* from, const int len,
00107                                    const float threshold,
00108                                    int*& index, float*& mag, float*& locs,
00109                                    const bool wrap=false);
00110   static float InterpolateParabola(float y1, float y0, float y2, 
00111                                    float&y); 
00112   static float BilinearInterpolate(const gevd_bufferxy& img, float x, float y);
00113   static void SupportAngle(const gevd_bufferxy& dirx, const gevd_bufferxy& diry,
00114                            const gevd_bufferxy& magnitude,
00115                            gevd_bufferxy*& angle);
00116 
00117   
00118   static void SurfaceNormal(const gevd_bufferxy& range, gevd_bufferxy*& normal);
00119   static void SurfaceCurvature(const gevd_bufferxy& normal, gevd_bufferxy*& curvature);
00120 
00121   static void SurfaceNormalD(const gevd_bufferxy& range, gevd_bufferxy*& normal,
00122                              float no_value, float pixel_distance=1.0f);
00123 #if 0 // -rgc- : does SurfaceCurvature need to calculate the actual distances instead of deducing them from the grid?
00124   static void SurfaceCurvatureD(const gevd_bufferxy& normal, gevd_bufferxy*& curvature,
00125                                 float dflt, float pixel_distance=1.0f);
00126 #endif // 0
00127   static void SurfaceCurvatureD(const gevd_bufferxy& normal, const gevd_bufferxy& surface,
00128                                 gevd_bufferxy*& curvature, float dflt, float pixel_distance=1.0f);
00129 
00130   
00131   static float ShrinkBy2(const gevd_bufferxy& cfrom, gevd_bufferxy*& to,
00132                          const float burt_ka=0.359375f); 
00133   static float ExpandBy2(const gevd_bufferxy& cfrom, gevd_bufferxy*& to,
00134                          const float burt_ka=0.359375f); 
00135   static void ShrinkBy2_D (const gevd_bufferxy& from, gevd_bufferxy*& to,
00136                            float no_value, float burt_ka=0.359375f );
00137   static int Pyramid(const float* from, const int length,
00138                      float*& to, int& nlevels, int trim=0,
00139                      const float burt_ka=0.359375f); 
00140   static int ShrinkBy2(const float* from, const int length,
00141                        float*& to, const float burt_ka=0.359375f);
00142 
00143   
00144   static bool WaveletTransform(float* array, const int n, 
00145                                const bool forwardp,
00146                                int nlevels,
00147                                const int waveletno=4);
00148   static bool WaveletTransformByBlock(float* array, 
00149                                       const int* dims, const int ndim,
00150                                       const bool forwardp,
00151                                       int nlevels,
00152                                       const int waveletno=4);
00153   static bool WaveletTransformByIndex(float* array,
00154                                       const int* dims, const int ndim,
00155                                       const bool forwardp, int nlevels,
00156                                       const int waveletno=4);
00157   static bool FindWavelet(const int waveletno,
00158                           float*& cc, float*& cr, int& ncof);
00159   static void LowHighPyramid(float* highPass, float* lowPass,
00160                              int n, int nlevels,
00161                              const float* lo_filter,
00162                              const float* hi_filter,
00163                              int ncof,
00164                              float* wksp);
00165 
00166 #if 0 // commented out
00167   static int DeleteMixedComponents(float* wave, 
00168                                    const int* dims, const int ndim,
00169                                    const int nlevels)
00170   static int TruncateHighFrequencies(float* wave,
00171                                      const int* dims, const int ndim,
00172                                      const int nlevels, 
00173                                      const float threshold=0.1f); 
00174   static int TruncateLowestFrequency(float* wave,
00175                                      const int* dims, const int ndim,
00176                                      const int nlevels,
00177                                      float& average); 
00178 #endif
00179 
00180   static bool WaveletTransformByBlock(const gevd_bufferxy& cfrom, gevd_bufferxy*& to,
00181                                       const bool forwardp,
00182                                       int nlevels,
00183                                       const int waveletno=4);
00184   static bool WaveletTransformByIndex(const gevd_bufferxy& cfrom, gevd_bufferxy*& to,
00185                                       const bool forwardp,
00186                                       int nlevels,
00187                                       const int waveletno=4);
00188   static int DeleteMixedComponents(gevd_bufferxy& wave,
00189                                    const int nlevels);
00190   static int TruncateHighFrequencies(gevd_bufferxy& wave,
00191                                      const int nlevels,
00192                                      const float threshold=0.1f);
00193   static int TruncateLowestFrequency(gevd_bufferxy& wave, const int nlevels);
00194   static int DeleteBoundaryArtifacts(float* wave, const int n, const int nlevels);
00195   static int DeleteBoundaryArtifacts(gevd_bufferxy& wave, const int nlevels);
00196 
00197   static void ProjectWaveOntoX(const gevd_bufferxy& buf, float*& proj,
00198                                const int nlevels=0);
00199   static void ProjectWaveOntoY(const gevd_bufferxy& buf, float*& proj,
00200                                const int nlevels=0);
00201 
00202   
00203   static void ProjectOntoX(const gevd_bufferxy& buf, float*& proj,
00204                            int sizeX=0, int sizeY=0,
00205                            int origX=0, int origY=0);
00206   static void ProjectOntoY(const gevd_bufferxy& buf, float*& proj,
00207                            int sizeX=0, int sizeY=0,
00208                            int origX=0, int origY=0);
00209 
00210   
00211   static float Correlation(const gevd_bufferxy& from, const gevd_bufferxy& kernel,
00212                            gevd_bufferxy*& to);
00213   static float CorrelationAlongAxis(const gevd_bufferxy& from,
00214                                     const gevd_bufferxy& kernel,
00215                                     gevd_bufferxy*& to);
00216 
00217   static float Correlation(const float* data, const int length,
00218                            const float* pattern, const int radius,
00219                            const int index);
00220   static float* Correlations(const float* data, const int length, 
00221                              const float* pattern, const int radius,
00222                              const int index, const int search);
00223   static float BestCorrelation(const float* data, const int length, 
00224                                const float* pattern, const int radius,
00225                                int& shift, const int search);
00226   static float CoarseFineCorrelation(const float* dataPyr, const int dlength,
00227                                      const float* patternPyr, const int plength,
00228                                      float& shift, 
00229                                      const int coarse, const int fine, 
00230                                      const float cutoff=0, 
00231                                      const float overlap=0.75f, 
00232                                      float* matches=0); 
00233 
00234 #if 0 // commented out
00235   static gevd_bufferxy* Correlations(const gevd_bufferxy& data, const gevd_bufferxy& pattern,
00236                                      const int* indexes, const int* search);
00237   static float Correlate(const gevd_bufferxy& data, const gevd_bufferxy& pattern,
00238                          const int* indexes);
00239   static float Correlate(const gevd_bufferxy& data, const gevd_bufferxy& pattern,
00240                          int*& shifts, const int* search);
00241 #endif
00242 
00243   static void Apply(gevd_bufferxy& buf, float (*func)(float));
00244 
00245   
00246 #if 0 // commented out
00247   static gevd_bufferxy* MakeImpulse(const float mag,
00248                                     int x=100, int y=100);
00249   static gevd_bufferxy* MakeGaussianNoise(const float mag, const float sigma,
00250                                           int x=100, int y=100);
00251   static gevd_bufferxy* MakeCircles(const float mag, float w1, float w2,
00252                                     int x=100, int y=100);
00253   static gevd_bufferxy* MakeEllipses(const float mag, const float w1, const float w2,
00254                                      const float eccentricity,
00255                                      int x=100, int y=100);
00256   static gevd_bufferxy* MakeSuperellipses(const float mag,
00257                                           const float w1, const float w2,
00258                                           float, float, float,
00259                                           int x=100, int y=100);
00260 #endif
00261 
00262   
00263   static gevd_bufferxy* AbsoluteDifference(const gevd_bufferxy& buf1, const gevd_bufferxy& buf2);
00264 
00265   
00266   static gevd_bufferxy* Allocate(gevd_bufferxy* space, const gevd_bufferxy& model,
00267                                  int bits_per_pixel=0, int sizeX=0, int sizeY=0);
00268   static gevd_bufferxy* SimilarBuffer(const gevd_bufferxy& buffer, 
00269                                       int bits_per_pixel=0,
00270                                       int sizeX=0, int sizeY=0);
00271   static bool IsSimilarBuffer(const gevd_bufferxy& buf1,    
00272                               const gevd_bufferxy& buf2);       
00273   static gevd_bufferxy* Extract(const gevd_bufferxy& buf,
00274                                 int sizeX=0, int sizeY=0,
00275                                 int origX=0, int origY=0);
00276   static void Update(gevd_bufferxy& old_buf, const gevd_bufferxy& new_buf,
00277                      int origX=0, int origY=0);
00278   static gevd_bufferxy* TransposeExtract(const gevd_bufferxy & buf,
00279                                          int sizeX, int sizeY, int origX, int origY);
00280   static void TransposeUpdate(gevd_bufferxy & buf, const gevd_bufferxy& sub,
00281                               int origX, int origY);
00282 
00283   static void Fill(gevd_bufferxy& buf, const float value,
00284                    int sizeX=0, int sizeY=0,
00285                    int origX=0, int origY=0);
00286   static void FillFrameX(gevd_bufferxy& buf, const float value, const int width=1);
00287   static void FillFrameY(gevd_bufferxy& buf, const float value, const int width=1);
00288   static void DrawFrame(gevd_bufferxy& buf, const int loc, const float value=0);
00289 
00290   static gevd_bufferxy* PadToPowerOf2(gevd_bufferxy& buf);
00291   static gevd_bufferxy* UnpadFromPowerOf2(gevd_bufferxy& padded, int sizeX, int sizeY);
00292 
00293   static float Maximum(const gevd_bufferxy& buf,
00294                        int sizeX=0, int sizeY=0,
00295                        int origX=0, int origY=0);
00296   static float Minimum(const gevd_bufferxy& buf,
00297                        int sizeX=0, int sizeY=0,
00298                        int origX=0, int origY=0);
00299   static bool Maximum(const float* data, const int length,
00300                       int& index, float& value);
00301 
00302   static float Sum(const gevd_bufferxy& buf,
00303                    int sizeX=0, int sizeY=0,
00304                    int origX=0, int origY=0);
00305   static int Threshold(gevd_bufferxy& buf, float noise,
00306                        int sizeX=0, int sizeY=0,
00307                        int origX=0, int origY=0);
00308 
00309   static float TruncateToPositive(gevd_bufferxy& buf);
00310   static float TruncateToCeiling(gevd_bufferxy& buf, float ceil);
00311   static void Absolute(gevd_bufferxy& buf);
00312   static void Negate(gevd_bufferxy& buf);
00313   static void Scale(gevd_bufferxy& buf, float factor);
00314   static void ShiftToPositive(gevd_bufferxy& buf);
00315   static void Normalize(gevd_bufferxy& buf, const float lo, const float hi);
00316 
00317   
00318   static bool BufferToFloat(const gevd_bufferxy& from, gevd_bufferxy& floatto);
00319   static bool FloatToBuffer(const gevd_bufferxy& floatfrom, gevd_bufferxy& to);
00320 
00321  protected:
00322   static int SetupPipeline(const float* data, const int len,
00323                            const int kradius, const bool wrap,
00324                            float*& cache, float*& pipeline);
00325   static gevd_bufferxy* WrapAlongX(const gevd_bufferxy& img);
00326   static gevd_bufferxy* WrapAlongY(const gevd_bufferxy& img);
00327   static float Gaussian(const float x, const float sigma);
00328   static float ShrinkBy2AlongX(const gevd_bufferxy& cfrom, const int y,
00329                                float* yline, const int len,
00330                                const float ka, const float kb, const float kc);
00331   static void ShrinkBy2AlongX_D( const gevd_bufferxy& from, int from_sizeX,
00332                                  int sizeX, int y, float kernel[],
00333                                  float no_value, float* yline, float* wline );
00334   static float ExpandBy2AlongX(const gevd_bufferxy& cfrom, const int y,
00335                                float* yline, const int len,
00336                                const float ka, const float kb, const float kc);
00337   static void WaveletTransformStep(float* array, const int n,
00338                                    const bool forwardp,
00339                                    const float* lo_filter,
00340                                    const float* hi_filter,
00341                                    const int ncof,
00342                                    float* wksp);
00343   static void WaveletTransformStep(float* array, const int* dims, const int ndim,
00344                                    const bool forwardp,
00345                                    const float* lo_filter,
00346                                    const float* hi_filter,
00347                                    const int ncof,
00348                                    float* buffer, float* wksp);
00349   static void CopyNdRecursive(const float* from_array,
00350                               const int from_size, const int* from_dims,
00351                               float* to_array,
00352                               const int to_size, const int* to_dims,
00353                               const int ndim, const bool fullp=true);
00354   static void TestWavelets();
00355 };
00356 
00357 #endif // gevd_float_operators_h_