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 #ifdef _SSE1_USED
00031 #include "sseUtil.h"
00032 #else
00033 #define SSE_PAD 4
00034 #endif
00035
00036 class FImage
00037 {
00038 private:
00039
00040 bool normalisation;
00041 int width;
00042 int height;
00043
00044 int channel;
00045
00046 float* palign;
00047 float* p1;
00048 float** data;
00049
00050 float* pPlus1;
00051 float** dataPlus1;
00052
00053 float* pMin1;
00054 float** dataMin1;
00055
00056 double PI;
00057
00058
00059 public:
00060
00061 FImage( int w, int h );
00062 FImage( int w, int h , float value);
00063 FImage( AnImage* source );
00064 FImage( AnImage* source , int achannel );
00065 FImage( AnImage* source, bool normalized );
00066 FImage( FImage& im);
00067
00068 ~FImage(){ delete[] palign; delete[] data; delete[] dataPlus1; delete[] dataMin1; p1=0; }
00069
00070 FImage* copy();
00071 FImage* scaleDown(int multiplier=2);
00072
00073 float* getData(){return p1;}
00074
00075 void setAll(float val=0.0);
00076 void set(FImage& im);
00077 void set(FImage& im, int n, int* xp, int* yp);
00078
00079 void setInZeroOneBox(float minVal=0.0, float maxVal=255.0);
00080 void setOutZeroOneBox(float minVal=0.0, float maxVal=255.0);
00081
00082 bool isNormalized(){ return normalisation; }
00083 inline int getWidth(){ return width; }
00084 inline int getHeight(){ return height; }
00085
00086
00087 inline float get(int x, int y){ return data[x][y]; }
00088 inline void set(int x,int y, float value){ data[x][y]= value; }
00089
00090 inline float getHMin1(int x, int y){ return dataMin1[x][y]; }
00091 inline void setHMin1(int x,int y, float value){ dataMin1[x][y]= value; }
00092
00093 inline float getHPlus1(int x, int y){ return dataPlus1[x][y]; }
00094 inline void setHPlus1(int x,int y, float value){ dataPlus1[x][y]= value; }
00095
00096 float getSafe(int x, int y);
00097 void setSafe(int x,int y, float value);
00098
00099 void gdistance1( float value );
00100 void gdistance2( float value );
00101
00102
00103
00104 void operator*=( float value );
00105 void operator/=( float value );
00106 void operator+=( float value );
00107 void operator-=( float value );
00108
00109 void operator+=( FImage& image );
00110 void operator-=( FImage& image );
00111
00112 void mult( float rsat );
00113 void limit( float rmin, float rmax );
00114
00115 void convolveHV(int m1, int m2, int m3);
00116 void convolveHV(int m1, int m2, int m3, int m4, int m5);
00117 void convolveHV(int m1, int m2, int m3, int m4, int m5, int m6, int m7);
00118
00119 void inverse(float biais=0.0000001);
00120 void ln(float biais=1.0);
00121 void exp();
00122 void root();
00123 void sqr();
00124 void power(float value);
00125
00126
00127
00128
00129
00130 float sigmaMeanRatio();
00131 float logSigma();
00132
00133
00134 float SNR(FImage& result)
00135 { return -10.0*::log( errorPLSE(result) ); }
00136
00137 float errorPLSE(FImage& result);
00138 double SE(FImage& result);
00139 float MSE(FImage& result)
00140 { return SE(result)/(width*height); }
00141 float NMSE(FImage& result);
00142 float RMSE(FImage& result)
00143 { return ::sqrt(MSE(result)); }
00144 float PSNR(FImage& result, float maxRange=255)
00145 { return 20*log(maxRange/RMSE(result)); }
00146
00147
00148 float laplacian(int x, int y);
00149 float isometricLaplacian(int x, int y);
00150 float normeGradient(int x, int y, float epsilon=1e-8);
00151
00152
00153 float meanCurvature(int x, int y);
00154 float curvature(int x, int y);
00155
00156 float gij(int i, int j, int x, int y);
00157 float lambdaPlus(int x,int y);
00158 float lambdaMinus(int x,int y);
00159 float normalDirection(int x, int y);
00160 float tangentDirection(int x, int y){ return (normalDirection(x,y)+PI/2.0); }
00161
00162
00163 float dfX_0(int x, int y);
00164 float dfY_0(int x, int y);
00165
00166 float dfX_0_div2(int x, int y, int idx, int idy);
00167 float dfY_0_div2(int x, int y, int idx, int idy);
00168
00169 float dfX_0_div2MinMod(int x, int y, int idx, int idy);
00170 float dfY_0_div2MinMod(int x, int y, int idx, int idy);
00171
00172 float dfX_0_2(int x, int y);
00173 float dfY_0_2(int x, int y);
00174
00175
00176 float dfX_p1(int x, int y);
00177 float dfY_p1(int x, int y);
00178 float dfX_m1(int x, int y);
00179 float dfY_m1(int x, int y);
00180
00181
00182 float dfX2(int x, int y);
00183 float dfY2(int x, int y);
00184 float dfXY(int x, int y);
00185 float dfXYc(int x, int y);
00186
00187 float dfX2_2(int x, int y);
00188 float dfY2_2(int x, int y);
00189 float dfXY_2(int x, int y);
00190
00191
00192 float dfX3(int x, int y);
00193 float dfY3(int x, int y);
00194
00195
00196
00197 float In(int x, int y);
00198
00199
00200 float Inn(int x, int y);
00201
00202
00203 float Iee(int x, int y);
00204
00205
00206 float g(int x, int y, int p=1);
00207
00208 float peronaMalikOperator(int x, int y);
00209 float meanCurvatureOperator(int x, int y);
00210 float beltramiOperator(int x, int y);
00211
00212 float gradCorrectiveViscosity(int x, int y);
00213
00214 void peronaMalikOperation(FImage& image, float coefficient);
00215 void peronaMalikRestoration(int nIterations, float coefficient);
00216
00217 void geodesicPeronaMalikOperation(FImage& image, float coefficient, float cgeod);
00218 void geodesicPeronaMalikRestoration(int nIterations, float coefficient, float cgeod);
00219
00220 void meanCurvatureOperation(FImage& image, float coefficient);
00221 void meanCurvatureRestoration(int nIterations, float coefficient);
00222
00223 void geodesicMeanCurvatureOperation(FImage& image, float coefficient, float cgeod);
00224 void geodesicMeanCurvatureRestoration(int nIterations, float coefficient, float cgeod);
00225
00226 void beltramiOperation(FImage& image, float coefficient);
00227 void beltramiRestoration(int nIterations, float coefficient);
00228
00229 void geodesicBeltramiOperation(FImage& image, float coefficient, float cgeod);
00230 void geodesicBeltramiRestoration(int nIterations, float coefficient, float cgeod);
00231 };
00232
00233 #endif