00001 #ifndef __RWaveletDenoisingOp__
00002 #define __RWaveletDenoisingOp__
00003
00004
00005
00052 #include <stdio.h>
00053
00054 #include "AbsRImageFilter.hpp"
00055
00056
00064 enum WvltDenoising
00065 {
00066 SureShrink=0,
00067 VisuShrink=1,
00068 Brownian=2
00069 };
00070
00071 #define ABS(x) (((x) < 0) ? -(x) : (x))
00072 #define MAX(x,y) (((x) < (y)) ? (y) : (x))
00073 #define MIN(x,y) (((x) < (y)) ? (x) : (y))
00074 #define WAVELETS 6
00075
00076 typedef double dtype;
00077 typedef unsigned char byte;
00078
00079
00080
00081 #define MAX_COEFS 25
00082 typedef struct
00083 {
00084 int length;
00085 int offset;
00086 double coefs[MAX_COEFS];
00087 } Filter;
00088
00089 class RWaveletDenoisingOp : public AbsRImageFilter
00090 {
00091 private:
00092
00093 int arg;
00094
00095 WvltDenoising algorithm;
00096 float alpha;
00097
00098 int cols;
00099 int rows;
00100 double *data;
00101 int dimensions;
00102 double **image;
00103
00104 int levels;
00105 int longest;
00106 int maxLevels;
00107 int n;
00108
00109 int verbose;
00110
00111 int wavelet;
00112
00113
00114 Filter* flo;
00115 Filter* fhi;
00116 Filter* ilo;
00117 Filter* ihi;
00118
00119 private:
00120
00121
00122 double bpThreshold2D(RImage* data, int rows, int cols, float criticalPt);
00123 void brownianBridge2D(RImage* data, int rows, int cols);
00124 double estimateNoise2D(RImage* data, int rows, int cols);
00125
00126 double sureThreshold(double *data, int n);
00127 void thresholdDetail(RImage* data, int rows, int cols, int level, int detail, double threshold);
00128
00129 protected:
00130
00131
00132 void InitializeFilters();
00133
00134
00135 void BoundingBox(int rows, int cols, int level, int detail, int *left, int *right, int *top, int *bottom);
00136 RImage* ExtractDetail(RImage* m, int rows, int cols, int level, int detail);
00137 int isDyadic(int x);
00138 int myLog2(int x);
00139 int power2(int x);
00140
00141
00142 void bpShrink2D(RImage* data, int rows, int cols, int levels, float alpha);
00143 void sureShrink2D(RImage* data, int rows, int cols, int levels);
00144 void visuShrink2D(RImage* data, int rows, int cols, int levels);
00145
00146
00147 void FwtMatrix(RImage* source, RImage* dest, int rows, int cols, int levels,
00148 Filter *lowpass, Filter *hipass);
00149 void IwtMatrix(RImage* source, RImage* dest, int rows, int cols, int levels,
00150 Filter *lowpass, Filter *hipass);
00151
00152 void FwtVector(double *source, double *dest, int length, int levels,
00153 Filter *lowpass, Filter *hipass);
00154 void IwtVector(double *source, double *dest, int length, int levels,
00155 Filter *lowpass, Filter *hipass);
00156
00157 public:
00158
00159 RWaveletDenoisingOp();
00160 RWaveletDenoisingOp(WvltDenoising type, int levels, int waveletId=0);
00161 virtual ~RWaveletDenoisingOp();
00162
00163
00164 virtual RImage* filter(RImage* src, RImage* dest=0);
00165 virtual RImage* selectedFilter(AnImage* mask, RImage* src, RImage* dest)
00166 { return filter(src, dest); }
00167
00168 virtual void report(FILE* file){ fprintf(file,"Real Gradient Operator\n"); }
00169 };
00170
00171
00172 #endif