OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimFilter.h
Go to the documentation of this file.
1 #ifndef ossimFilter_HEADER
2 #define ossimFilter_HEADER
3 #include <math.h>
4 #include <ossim/matrix/newmat.h>
5 #include <ossim/base/ossimRtti.h>
7 
9 {
10 public:
12  {}
13  virtual ~ossimFilter() {}
14 
15  virtual double filter (double x, double support)const = 0;
28  virtual NEWMAT::Matrix *newMatrix(long width=3,
29  double middle=0.0,
30  double scale=0.0)const;
31  virtual void createMatrix(NEWMAT::Matrix& m,
32  long width=3,
33  double middle=0.0,
34  double scale=0.0)const;
35 
36  virtual NEWMAT::RowVector *newVector(long width,
37  double middle=0.0,
38  double scale = 1.0)const;
39  static double Sinc(double x)
40  {
41  if (x != 0.0)
42  {
43  x*=M_PI;
44  return(sin(x)/x);
45  }
46 
47  return(1.0);
48  }
49  static double Sinc(double x, double /* support */ )
50  {
51  if (x != 0.0)
52  {
53  x*=M_PI;
54  return(sin(x)/x);
55  }
56 
57  return(1.0);
58  }
59 
60  virtual double getSupport()const=0;
61 
63 };
64 
66 {
67 public:
69  virtual ~ossimBoxFilter() {}
70 
71  virtual double filter (double x, double /* support */ )const
72  {
73  if (x < -0.5)
74  return(0.0);
75  if (x < 0.5)
76  return(1.0);
77  return(0.0);
78  }
79  virtual double getSupport()const
80  {
81  return .5;
82  }
84 };
85 
87 {
88 public:
90  virtual ~ossimSincFilter(){}
91  double filter(double x, double /* support */ )const
92  {
93  x*=M_PI;
94  if (x != 0.0)
95  return(sin(x)/x);
96  return(1.0);
97  }
98  virtual double getSupport()const
99  {
100  return 1.0;
101  }
102 TYPE_DATA
103 };
104 
106 {
107 public:
109  virtual ~ossimBellFilter(){}
110  virtual double getSupport()const
111  {
112  return 1.5;
113  }
114  virtual double filter(double value, double /* support */ )const
115  {
116  if(value < 0) value = -value;
117  if(value < .5) return(.75 - (value * value));
118  if(value < 1.5) {
119  value = (value - 1.5);
120  return(.5 * (value * value));
121  }
122  return(0.0);
123  }
124 TYPE_DATA
125 };
126 
128 {
129 public:
132 
133  virtual double getSupport()const
134  {
135  return 0.0;
136  }
137 TYPE_DATA
138 };
139 
140 
142 {
143 public:
146  virtual double filter(double value, double /* support */ )const;
147  virtual double getSupport()const
148  {
149  return 1.0;
150  }
151 TYPE_DATA
152 };
154 {
155 public:
157  virtual ~ossimBesselFilter(){}
158  virtual double filter(double x, double support)const
159  {
160  if (x == 0.0)
161  {
162  return(M_PI/4.0);
163  }
164 
165  return(ossimBesselOrderOneFilter().filter((M_PI*x)/(2.0*x), support));
166  }
167  virtual double getSupport()const
168  {
169  return 1.0;
170  }
171 
172 TYPE_DATA
173 };
174 
176 {
177 public:
179  virtual ~ossimBlackmanFilter() {}
180 
181  virtual double filter (double x, double /* support */ ) const
182  {
183  return(0.42+0.50*cos(M_PI*x)+0.08*cos(2.0*M_PI*x));
184  }
185  virtual double getSupport()const
186  {
187  return 1.0;
188  }
189 TYPE_DATA
190 };
191 
193 {
194 public:
197 
198  virtual double filter (double x, double support) const
199  {
200  return ((ossimBlackmanFilter::filter(x/support,support))*
201  (ossimSincFilter().filter(x, support)));
202  }
203  virtual double getSupport()const
204  {
205  return 4.0;
206  }
207 TYPE_DATA
208 };
209 
211 {
212 public:
215 
216  virtual double filter (double x, double support) const
217  {
218  return ((ossimBlackmanFilter::filter(x/support,support))*
219  (ossimBesselFilter().filter(x, support)));
220  }
221  virtual double getSupport()const
222  {
223  return 3.2383;
224  }
225 TYPE_DATA
226 };
227 
228 
230 {
231 public:
233  virtual ~ossimCatromFilter(){}
234  double filter(double x, double /* support */ )const
235  {
236  if (x < -2.0)
237  return(0.0);
238  if (x < -1.0)
239  return(0.5*(4.0+x*(8.0+x*(5.0+x))));
240  if (x < 0.0)
241  return(0.5*(2.0+x*x*(-5.0-3.0*x)));
242  if (x < 1.0)
243  return(0.5*(2.0+x*x*(-5.0+3.0*x)));
244  if (x < 2.0)
245  return(0.5*(4.0+x*(-8.0+x*(5.0-x))));
246  return(0.0);
247  }
248  virtual double getSupport()const
249  {
250  return 2.0;
251  }
252 TYPE_DATA
253 };
254 
256 {
257 public:
259  virtual ~ossimCubicFilter(){}
260  double filter(double x, double /* support */ )const
261  {
262  if (x < -2.0)
263  return(0.0);
264  if (x < -1.0)
265  return((2.0+x)*(2.0+x)*(2.0+x)/6.0);
266  if (x < 0.0)
267  return((4.0+x*x*(-6.0-3.0*x))/6.0);
268  if (x < 1.0)
269  return((4.0+x*x*(-6.0+3.0*x))/6.0);
270  if (x < 2.0)
271  return((2.0-x)*(2.0-x)*(2.0-x)/6.0);
272  return(0.0);
273  }
274  virtual double getSupport()const
275  {
276  return 2.0;
277  }
278 TYPE_DATA
279 };
280 
282 {
283 public:
286  virtual double filter(double value, double /* support */ )const
287  {
288  double tt;
289 
290  if(value < 0) value = -value;
291  if(value < 1) {
292  tt = value * value;
293  return((.5 * tt * value) - tt + (2.0 / 3.0));
294  } else if(value < 2) {
295  value = 2 - value;
296  return((1.0 / 6.0) * (value * value * value));
297  }
298  return(0.0);
299  }
300  virtual double getSupport()const
301  {
302  return 2.0;
303  }
304 TYPE_DATA
305 };
306 
308 {
309 public:
311  virtual ~ossimGaussianFilter() {}
312 
313  virtual double filter (double x, double /* support */ ) const
314  {
315  return(exp(-2.0*x*x)*sqrt(2.0/M_PI));
316  }
317  virtual double getSupport()const
318  {
319  return 1.25;
320  }
321 TYPE_DATA
322 };
323 
325 {
326 public:
329  double filter(double x, double /* support */ )const
330  {
331  return(0.5+0.5*cos(M_PI*x));
332  }
333  virtual double getSupport()const
334  {
335  return 1.0;
336  }
337 TYPE_DATA
338 };
339 
341 {
342 public:
344  virtual ~ossimHammingFilter() {}
345 
346  virtual double filter (double x, double /* support */ ) const
347  {
348  return(0.54+0.46*cos(M_PI*x));
349  }
350  virtual double getSupport()const
351  {
352  return 1.0;
353  }
354 TYPE_DATA
355 };
356 
358 {
359 public:
362  double filter(double x, double /* support */ )const
363  {
364  if (x < -1.0)
365  return(0.0);
366  if (x < 0.0)
367  return((2.0*(-x)-3.0)*(-x)*(-x)+1.0);
368  if (x < 1.0)
369  return((2.0*x-3.0)*x*x+1.0);
370  return(0.0);
371  }
372  virtual double getSupport()const
373  {
374  return 1.0;
375  }
376 TYPE_DATA
377 };
378 
379 
381 {
382 public:
385  double filter(double x, double /* support */ )const
386  {
387  if (x < -3.0)
388  return(0.0);
389  if (x < 0.0)
390  return(Sinc(-x,getSupport())*Sinc(-x/3.0,getSupport()));
391  if (x < 3.0)
392  return(Sinc(x,getSupport())*Sinc(x/3.0,getSupport()));
393  return(0.0);
394  }
395  virtual double getSupport()const
396  {
397  return 3.0;
398  }
399 TYPE_DATA
400 };
401 
403 {
404 public:
406  virtual ~ossimMagicFilter(){}
407  double filter(double x, double /* support */ )const
408  {
409  if (x <= -1.5)
410  return(0.0);
411  if (x <= -0.5)
412  return (0.5*ossim::square(x + 1.5));
413  if (x <=0.5)
414  return (0.75-ossim::square(x));
415  if(x <= 0.75)
416  return (0.5*ossim::square(x-1.5));
417 
418  return(0.0);
419  }
420  virtual double getSupport()const
421  {
422  return 1.5;
423  }
424 TYPE_DATA
425 };
426 
428 {
429 public:
432  double filter(double x, double /* support */ )const
433  {
434 #define MITCHELL_B (1.0/3.0)
435 #define MITCHELL_C (1.0/3.0)
436 #define MITCHELL_P0 (( 6.0- 2.0*MITCHELL_B )/6.0)
437 #define MITCHELL_P2 ((-18.0+12.0*MITCHELL_B+ 6.0*MITCHELL_C)/6.0)
438 #define MITCHELL_P3 (( 12.0- 9.0*MITCHELL_B- 6.0*MITCHELL_C)/6.0)
439 #define MITCHELL_Q0 (( 8.0*MITCHELL_B+24.0*MITCHELL_C)/6.0)
440 #define MITCHELL_Q1 (( -12.0*MITCHELL_B-48.0*MITCHELL_C)/6.0)
441 #define MITCHELL_Q2 (( 6.0*MITCHELL_B+30.0*MITCHELL_C)/6.0)
442 #define MITCHELL_Q3 (( - 1.0*MITCHELL_B- 6.0*MITCHELL_C)/6.0)
443 
444  if (x < -2.0)
445  return(0.0);
446  if (x < -1.0)
448  if (x < 0.0)
450  if (x < 1.0)
452  if (x < 2.0)
454  return(0.0);
455  }
456  virtual double getSupport()const
457  {
458  return 2.0;
459  }
460 TYPE_DATA
461 };
462 
464 {
465 public:
468  double filter(double x, double /* support */ )const
469  {
470  if (x < -1.5)
471  return(0.0);
472  if (x < -0.5)
473  return(0.5*(x+1.5)*(x+1.5));
474  if (x < 0.5)
475  return(0.75-x*x);
476  if (x < 1.5)
477  return(0.5*(x-1.5)*(x-1.5));
478  return(0.0);
479  }
480  double getSupport()const
481  {
482  return 1.5;
483  }
484 TYPE_DATA
485 };
486 
488 {
489 public:
491  virtual ~ossimTriangleFilter() {}
492 
493  virtual double filter (double x, double /* support */ )const
494  {
495  if (x < -1.0)
496  return(0.0);
497  if (x < 0.0)
498  return(1.0+x);
499  if (x < 1.0)
500  return(1.0-x);
501  return(0.0);
502  }
503  virtual double getSupport()const
504  {
505  return 1.0;
506  }
507 TYPE_DATA
508 };
509 
510 
511 #endif
virtual double filter(double x, double) const
Definition: ossimFilter.h:181
ossim_uint32 x
double filter(double x, double) const
Definition: ossimFilter.h:468
double filter(double x, double) const
Definition: ossimFilter.h:91
double getSupport() const
Definition: ossimFilter.h:480
virtual double getSupport() const
Definition: ossimFilter.h:221
virtual double filter(double value, double) const
virtual double filter(double x, double) const
Definition: ossimFilter.h:313
virtual double filter(double value, double) const
Definition: ossimFilter.h:286
virtual void createMatrix(NEWMAT::Matrix &m, long width=3, double middle=0.0, double scale=0.0) const
virtual double getSupport() const =0
virtual ~ossimBesselFilter()
Definition: ossimFilter.h:157
virtual double getSupport() const
Definition: ossimFilter.h:456
double filter(double x, double) const
Definition: ossimFilter.h:329
virtual ~ossimBellFilter()
Definition: ossimFilter.h:109
virtual double getSupport() const
Definition: ossimFilter.h:274
#define MITCHELL_Q2
virtual ~ossimBesselOrderOneFilter()
Definition: ossimFilter.h:145
double filter(double x, double) const
Definition: ossimFilter.h:260
virtual double getSupport() const
Definition: ossimFilter.h:185
virtual double getSupport() const
Definition: ossimFilter.h:147
double filter(double x, double) const
Definition: ossimFilter.h:407
virtual NEWMAT::RowVector * newVector(long width, double middle=0.0, double scale=1.0) const
#define MITCHELL_P0
double filter(double x, double) const
Definition: ossimFilter.h:362
double filter(double x, double) const
Definition: ossimFilter.h:385
T square(T x)
Definition: ossimCommon.h:334
virtual ~ossimQuadraticFilter()
Definition: ossimFilter.h:467
virtual ~ossimBSplineFilter()
Definition: ossimFilter.h:285
virtual ~ossimLanczosFilter()
Definition: ossimFilter.h:384
virtual ~ossimMitchellFilter()
Definition: ossimFilter.h:431
virtual double filter(double x, double) const
Definition: ossimFilter.h:493
virtual double filter(double x, double support) const
Definition: ossimFilter.h:158
virtual ~ossimCatromFilter()
Definition: ossimFilter.h:233
#define MITCHELL_Q1
virtual double getSupport() const
Definition: ossimFilter.h:350
virtual double filter(double x, double) const
Definition: ossimFilter.h:71
virtual ~ossimCubicFilter()
Definition: ossimFilter.h:259
virtual ~ossimHammingFilter()
Definition: ossimFilter.h:344
virtual ~ossimBlackmanSincFilter()
Definition: ossimFilter.h:196
virtual double getSupport() const
Definition: ossimFilter.h:248
#define M_PI
virtual double filter(double x, double) const
Definition: ossimFilter.h:346
double filter(double x, double) const
Definition: ossimFilter.h:234
virtual NEWMAT::Matrix * newMatrix(long width=3, double middle=0.0, double scale=0.0) const
#define MITCHELL_Q3
virtual ~ossimBoxFilter()
Definition: ossimFilter.h:69
#define TYPE_DATA
Definition: ossimRtti.h:339
virtual ~ossimHermiteFilter()
Definition: ossimFilter.h:361
virtual double getSupport() const
Definition: ossimFilter.h:98
virtual ~ossimBlackmanBesselFilter()
Definition: ossimFilter.h:214
double filter(double x, double) const
Definition: ossimFilter.h:432
virtual ~ossimNearestNeighborFilter()
Definition: ossimFilter.h:131
virtual ~ossimTriangleFilter()
Definition: ossimFilter.h:491
virtual double getSupport() const
Definition: ossimFilter.h:395
virtual ~ossimSincFilter()
Definition: ossimFilter.h:90
virtual ~ossimHanningFilter()
Definition: ossimFilter.h:328
virtual double filter(double x, double support) const =0
static double Sinc(double x)
Definition: ossimFilter.h:39
virtual ~ossimBlackmanFilter()
Definition: ossimFilter.h:179
virtual double getSupport() const
Definition: ossimFilter.h:79
virtual double filter(double x, double support) const
Definition: ossimFilter.h:198
virtual ~ossimMagicFilter()
Definition: ossimFilter.h:406
virtual double getSupport() const
Definition: ossimFilter.h:300
virtual double getSupport() const
Definition: ossimFilter.h:203
virtual double getSupport() const
Definition: ossimFilter.h:167
virtual double getSupport() const
Definition: ossimFilter.h:333
virtual double getSupport() const
Definition: ossimFilter.h:420
virtual double getSupport() const
Definition: ossimFilter.h:372
virtual ~ossimGaussianFilter()
Definition: ossimFilter.h:311
#define MITCHELL_P3
virtual double filter(double value, double) const
Definition: ossimFilter.h:114
virtual double filter(double x, double support) const
Definition: ossimFilter.h:216
#define MITCHELL_Q0
static double Sinc(double x, double)
Definition: ossimFilter.h:49
virtual double getSupport() const
Definition: ossimFilter.h:110
#define MITCHELL_P2
virtual double getSupport() const
Definition: ossimFilter.h:317
virtual double getSupport() const
Definition: ossimFilter.h:503
virtual double getSupport() const
Definition: ossimFilter.h:133
virtual ~ossimFilter()
Definition: ossimFilter.h:13