00001 #ifndef __WeickertFilter__
00002 #define __WeickertFilter__
00003 
00004 
00005 
00024 #include <stdio.h>
00025 
00026 #include "AnImage.hpp"
00027 #include "AbsRImageFilter.hpp"
00028 
00029 #include "BeltramiFlow.hpp"
00030 
00031 class WeickertFilter : public AbsRImageFilter
00032 {
00033 protected:
00034 
00035 RImage*                 I0;                             
00036 RImage*                 I;                              
00037 
00038 double                  lambda;                 
00039 
00040 int                             niterations;
00041 double                  alpha;
00042 
00043 RImage*                 ux;
00044 RImage*                 uy;
00045 
00046 RImage*                 j1;
00047 RImage*                 j2;
00048 
00049 double                  m;
00050 double                  Cm;
00051 
00052 protected:
00053 
00054 void    precompute();
00055 void    precompute(AnImage& mask);
00056 
00057 double  divergentJ(int x, int y)
00058         {
00059         return  (j1->dfX_0(x,y) + j2->dfY_0(x,y));
00060         }
00061 
00062 virtual void operations(RImage& result);
00063 virtual void operations(AnImage& mask, RImage& result);
00064 
00065 public:
00066         
00067 WeickertFilter(int n=100, double ralpha=0.1, double rlambda=5.0, double rCm=3.31488);
00068 virtual ~WeickertFilter(){}
00069 
00070 
00071 virtual RImage* filter(RImage* src, RImage* dest=0);
00072 virtual RImage* selectedFilter(AnImage* mask, RImage* src, RImage* dest=0);
00073 
00074 virtual void report(FILE* file){}
00075 };
00076 
00077 
00078 #endif