00001 #ifndef __FImage__
00002 #define __FImage__
00003 
00004 
00005 
00024 #include <stdio.h>
00025 #include <math.h>
00026 #include <memory.h>
00027 
00028 #include "AnImage.hpp"
00029 
00030 class FImage 
00031 {
00032 private:
00033         
00034 bool            normalisation;          
00035 int             width;
00036 int                     height;
00037 
00038 int                     channel;
00039 
00040 
00041 float*          p1;
00042 float** data;
00043 
00044 double          PI;
00045 
00046 
00047 public:
00048 
00049 FImage( int w, int h );
00050 FImage( int w, int h , float value);
00051 FImage( AnImage* source );
00052 FImage( AnImage* source , int achannel );
00053 FImage( AnImage* source, bool normalized );
00054 FImage( FImage& im);                                                            
00055 
00056 ~FImage(){ delete[] data; delete[] p1; }
00057 
00058 FImage* copy();
00059 FImage* scaleDown(int multiplier=2);
00060 
00061 float* getData(){return p1;}
00062 
00063 void    set(FImage& im); 
00064 void    set(FImage& im, int n, int* xp, int* yp);
00065 
00066 bool isNormalized(){ return normalisation; }
00067 inline int getWidth(){ return width; }
00068 inline int getHeight(){ return height; }
00069 
00070 
00071 inline float    get(int x, int y){ return data[x][y]; }
00072 inline void     set(int x,int y, float value){ data[x][y]= value; }
00073 
00074 float   getSafe(int x, int y);
00075 void    setSafe(int x,int y, float value);
00076 
00077 void    gdistance1( float value );
00078 void    gdistance2( float value );
00079 
00080 
00081 
00082 void    operator*=( float value );
00083 void    operator/=( float value );
00084 void    operator+=( float value );
00085 void    operator-=( float value );
00086 
00087 void    operator+=( FImage& image );
00088 void    operator-=( FImage& image );
00089 
00090 void    mult( float rsat );
00091 void    limit( float rmin, float rmax );
00092 
00093 void    convolveHV(int m1, int m2, int m3);                     
00094 
00095 void    inverse(float biais=0.0000001);
00096 void    ln(float biais=1.0);
00097 void    exp();
00098 void    root();
00099 void    sqr();
00100 void    power(float value);
00101 
00102 float   laplacian(int x, int y);
00103 float   isometricLaplacian(int x, int y);
00104 float   normeGradient(int x, int y, float epsilon=1e-8);
00105 
00106 
00107 float   meanCurvature(int x, int y);
00108 float   curvature(int x, int y);
00109 
00110 float   gij(int i, int j, int x, int y);
00111 float   lambdaPlus(int x,int y);
00112 float   lambdaMinus(int x,int y);
00113 float   normalDirection(int x, int y);
00114 float   tangentDirection(int x, int y){ return (normalDirection(x,y)+PI/2.0); }
00115 
00116 
00117 float dfX_0(int x, int y);
00118 float dfY_0(int x, int y);
00119 
00120 float dfX_0_div2(int x, int y, int idx, int idy);                       
00121 float dfY_0_div2(int x, int y, int idx, int idy);
00122 
00123 float dfX_0_div2MinMod(int x, int y, int idx, int idy); 
00124 float dfY_0_div2MinMod(int x, int y, int idx, int idy);
00125 
00126 float dfX_0_2(int x, int y);                                                            
00127 float dfY_0_2(int x, int y);
00128 
00129 
00130 float dfX_p1(int x, int y);
00131 float dfY_p1(int x, int y);
00132 float dfX_m1(int x, int y);
00133 float dfY_m1(int x, int y);
00134 
00135 
00136 float dfX2(int x, int y);
00137 float dfY2(int x, int y);
00138 float dfXY(int x, int y);
00139 float dfXYc(int x, int y);
00140 
00141 float dfX2_2(int x, int y);             
00142 float dfY2_2(int x, int y);
00143 float dfXY_2(int x, int y);
00144 
00145 
00146 float dfX3(int x, int y);
00147 float dfY3(int x, int y);
00148 
00149 
00150 
00151 float In(int x, int y);
00152 
00153 
00154 float Inn(int x, int y);
00155 
00156 
00157 float Iee(int x, int y);
00158 
00159 
00160 float g(int x, int y, int p=1);
00161 
00162 float peronaMalikOperator(int x, int y);
00163 float meanCurvatureOperator(int x, int y);
00164 float beltramiOperator(int x, int y);
00165 
00166 float gradCorrectiveViscosity(int x, int y);
00167 
00168 void peronaMalikOperation(FImage& image, float coefficient);
00169 void peronaMalikRestoration(int nIterations, float coefficient);
00170 
00171 void geodesicPeronaMalikOperation(FImage& image, float coefficient, float cgeod);
00172 void geodesicPeronaMalikRestoration(int nIterations, float coefficient, float cgeod);
00173 
00174 void meanCurvatureOperation(FImage& image, float coefficient);
00175 void meanCurvatureRestoration(int nIterations, float coefficient);
00176 
00177 void geodesicMeanCurvatureOperation(FImage& image, float coefficient, float cgeod);
00178 void geodesicMeanCurvatureRestoration(int nIterations, float coefficient, float cgeod);
00179 
00180 void beltramiOperation(FImage& image, float coefficient);
00181 void beltramiRestoration(int nIterations, float coefficient);
00182 
00183 void geodesicBeltramiOperation(FImage& image, float coefficient, float cgeod);
00184 void geodesicBeltramiRestoration(int nIterations, float coefficient, float cgeod);
00185 };
00186 
00187 #endif