00001 #ifndef convolve_h
00002 #define convolve_h
00003
00004
00005 #include "fl/image.h"
00006 #include "fl/matrix.h"
00007 #include "fl/point.h"
00008
00009 #include <ostream>
00010
00011
00012 namespace fl
00013 {
00014 enum BorderMode
00015 {
00016 Crop,
00017 ZeroFill,
00018 Boost,
00019 UseZeros
00020 };
00021
00046 class Convolution : public Filter
00047 {
00048 public:
00049 virtual Image filter (const Image & image) = 0;
00050 virtual double response (const Image & image, const Point & p) const = 0;
00051
00052 BorderMode mode;
00053 };
00054
00055
00056
00057
00061 class ConvolutionDiscrete2D : public Convolution, public Image
00062 {
00063 public:
00064 ConvolutionDiscrete2D (const BorderMode mode = Crop,
00065 const PixelFormat & format = GrayFloat);
00066 ConvolutionDiscrete2D (const Image & image, const BorderMode mode = Crop);
00067
00068 virtual Image filter (const Image & image);
00069 virtual double response (const Image & image, const Point & p) const;
00070
00071 void normalFloats ();
00072 };
00073
00074 class Gaussian2D : public ConvolutionDiscrete2D
00075 {
00076 public:
00077 Gaussian2D (double sigma = 1.0,
00078 const BorderMode mode = Crop,
00079 const PixelFormat & format = GrayFloat);
00080
00081 static double cutoff;
00082 };
00083
00084 class DifferenceOfGaussians : public ConvolutionDiscrete2D
00085 {
00086 public:
00087 DifferenceOfGaussians (double sigmaPlus,
00088 double sigmaMinus,
00089 const BorderMode mode = Crop,
00090 const PixelFormat & format = GrayFloat);
00091 };
00092
00093 class GaussianDerivativeFirst : public ConvolutionDiscrete2D
00094 {
00095 public:
00096 GaussianDerivativeFirst (int xy = 0,
00097 double sigmaX = 1.0,
00098 double sigmaY = -1.0,
00099 double angle = 0,
00100 const BorderMode mode = Crop,
00101 const PixelFormat & format = GrayFloat);
00102 };
00103
00104 class GaussianDerivativeSecond : public ConvolutionDiscrete2D
00105 {
00106 public:
00107 GaussianDerivativeSecond (int xy1 = 0,
00108 int xy2 = 0,
00109 double sigmaX = 1.0,
00110 double sigmaY = -1.0,
00111 double angle = 0,
00112 const BorderMode mode = Crop,
00113 const PixelFormat & format = GrayFloat);
00114 };
00115
00116 class GaussianDerivativeThird : public ConvolutionDiscrete2D
00117 {
00118 public:
00119 GaussianDerivativeThird (int xy1 = 0,
00120 int xy2 = 0,
00121 int xy3 = 0,
00122 double sigmaX = 1.0,
00123 double sigmaY = -1.0,
00124 double angle = 0,
00125 const BorderMode mode = Crop,
00126 const PixelFormat & format = GrayFloat);
00127 };
00128
00129 class Laplacian : public ConvolutionDiscrete2D
00130 {
00131 public:
00132 Laplacian (double sigma = 1.0,
00133 const BorderMode mode = Crop,
00134 const PixelFormat & format = GrayFloat);
00135
00136 double sigma;
00137 };
00138
00139
00140
00141
00142 enum Direction
00143 {
00144 Vertical,
00145 Horizontal
00146 };
00147
00148 class Convolution1D : public Convolution
00149 {
00150 public:
00151 Direction direction;
00152 };
00153
00154 class ConvolutionDiscrete1D : public Convolution1D, public Image
00155 {
00156 public:
00157 ConvolutionDiscrete1D (const BorderMode mode = Crop,
00158 const PixelFormat & format = GrayFloat,
00159 const Direction direction = Horizontal);
00160 ConvolutionDiscrete1D (const Image & image,
00161 const BorderMode mode = Crop,
00162 const Direction direction = Horizontal);
00163
00164 virtual Image filter (const Image & image);
00165 virtual double response (const Image & image, const Point & p) const;
00166
00167 void normalFloats ();
00168 };
00169
00170 class Gaussian1D : public ConvolutionDiscrete1D
00171 {
00172 public:
00173 Gaussian1D (double sigma = 1.0,
00174 const BorderMode mode = Crop,
00175 const PixelFormat & format = GrayFloat,
00176 const Direction direction = Horizontal);
00177 };
00178
00179 class GaussianDerivative1D : public ConvolutionDiscrete1D
00180 {
00181 public:
00182 GaussianDerivative1D (double sigma = 1.0,
00183 const BorderMode mode = Crop,
00184 const PixelFormat & format = GrayFloat,
00185 const Direction direction = Horizontal);
00186 };
00187
00188 class GaussianDerivativeSecond1D : public ConvolutionDiscrete1D
00189 {
00190 public:
00191 GaussianDerivativeSecond1D (double sigma = 1.0,
00192 const BorderMode mode = Crop,
00193 const PixelFormat & format = GrayFloat,
00194 const Direction direction = Horizontal);
00195 };
00196
00203 class ConvolutionRecursive1D : public Convolution1D
00204 {
00205 public:
00206 virtual Image filter (const Image & image);
00207 virtual double response (const Image & image, const Point & p) const;
00208
00209 void set_nii_and_dii (double sigma,
00210 double a0, double a1,
00211 double b0, double b1,
00212 double c0, double c1,
00213 double o0, double o1);
00214
00215
00216 double n00p;
00217 double n11p;
00218 double n22p;
00219 double n33p;
00220 double n11m;
00221 double n22m;
00222 double n33m;
00223 double n44m;
00224 double d11p;
00225 double d22p;
00226 double d33p;
00227 double d44p;
00228 double d11m;
00229 double d22m;
00230 double d33m;
00231 double d44m;
00232 double scale;
00233 };
00234
00235 class GaussianRecursive1D : public ConvolutionRecursive1D
00236 {
00237 public:
00238 GaussianRecursive1D (double sigma = 1.0,
00239 const Direction direction = Horizontal);
00240 };
00241
00242 class GaussianDerivativeRecursive1D : public ConvolutionRecursive1D
00243 {
00244 public:
00245 GaussianDerivativeRecursive1D (double sigma = 1.0,
00246 const Direction direction = Horizontal);
00247 };
00248
00249 class GaussianDerivativeSecondRecursive1D : public ConvolutionRecursive1D
00250 {
00251 public:
00252 GaussianDerivativeSecondRecursive1D (double sigma = 1.0,
00253 const Direction direction = Horizontal);
00254 };
00255
00256
00257
00258
00259 class FilterHarris : public Filter
00260 {
00261 public:
00262 FilterHarris (double sigmaD = 1.0, double sigmaI = 1.4, const PixelFormat & format = GrayFloat);
00263
00264 virtual Image filter (const Image & image);
00265 virtual void preprocess (const Image & image);
00266 virtual Image process ();
00267 virtual double response (int x, int y) const;
00268 virtual void gradientSquared (int x, int y, Matrix<double> & result) const;
00269
00270 double sigmaD;
00271 double sigmaI;
00272 Gaussian2D G_I;
00273 Gaussian1D G1_I;
00274 Gaussian1D G1_D;
00275 GaussianDerivative1D dG_D;
00276 Image xx;
00277 Image xy;
00278 Image yy;
00279 int offset;
00280 int offsetI;
00281 int offsetD;
00282
00283 static const double alpha;
00284
00285 protected:
00292 int offset1;
00293 int offset2;
00294 };
00295
00301 class FilterHarrisEigen : public FilterHarris
00302 {
00303 public:
00304 FilterHarrisEigen (double sigmaD = 1.0, double sigmaI = 1.4, const PixelFormat & format = GrayFloat) : FilterHarris (sigmaD, sigmaI, format) {}
00305
00306 virtual Image process ();
00307 virtual double response (const int x, const int y) const;
00308 };
00309
00313 class FilterHessian : public Filter
00314 {
00315 public:
00316 FilterHessian (double sigma = 1.0, const PixelFormat & format = GrayFloat);
00317
00318 virtual Image filter (const Image & image);
00319
00320 double sigma;
00321 Gaussian1D G;
00322 GaussianDerivativeSecond1D dG;
00323 int offset;
00324
00325 protected:
00326 int offset1;
00327 int offset2;
00328 };
00329
00330
00331
00332
00341 class FiniteDifferenceX : public Filter
00342 {
00343 public:
00344 virtual Image filter (const Image & image);
00345 };
00346
00350 class FiniteDifferenceY : public Filter
00351 {
00352 public:
00353 virtual Image filter (const Image & image);
00354 };
00355
00356 class NonMaxSuppress : public Filter
00357 {
00358 public:
00359 NonMaxSuppress (int half = 1, BorderMode mode = UseZeros);
00360
00361 virtual Image filter (const Image & image);
00362
00363 int half;
00364 BorderMode mode;
00365 float maximum;
00366 float minimum;
00367 float average;
00368 int count;
00369 };
00370
00375 class IntensityAverage : public Filter
00376 {
00377 public:
00378 IntensityAverage (bool ignoreZeros = false);
00379
00380 virtual Image filter (const Image & image);
00381
00382 float average;
00383 float minimum;
00384 float maximum;
00385 int count;
00386 bool ignoreZeros;
00387 };
00388
00393 class IntensityDeviation : public Filter
00394 {
00395 public:
00396 IntensityDeviation (float average, bool ignoreZeros = false);
00397
00398 virtual Image filter (const Image & image);
00399
00400 float average;
00401 float deviation;
00402 bool ignoreZeros;
00403 };
00404
00409 class IntensityHistogram : public Filter
00410 {
00411 public:
00412 IntensityHistogram (const std::vector<float> & ranges);
00413 IntensityHistogram (float minimum, float maximum, int bins);
00414
00415 virtual Image filter (const Image & image);
00416
00417 int total () const;
00418 void dump (std::ostream & stream, bool center = false, bool percent = false) const;
00419
00420 std::vector<float> ranges;
00421 std::vector<int> counts;
00422 };
00423
00427 class Normalize : public Filter
00428 {
00429 public:
00430 Normalize (double length = 1);
00431
00432 virtual Image filter (const Image & image);
00433
00434 double length;
00435 };
00436
00440 class AbsoluteValue : public Filter
00441 {
00442 public:
00443 virtual Image filter (const Image & image);
00444 };
00445
00451 class Rescale : public Filter
00452 {
00453 public:
00454 Rescale (double a = 1.0, double b = 0);
00455 Rescale (const Image & image, bool useFullRange = true);
00456 virtual Image filter (const Image & image);
00457
00458 double a;
00459 double b;
00460 };
00461
00462 class Transform : public Filter
00463 {
00464 public:
00465 Transform (const Matrix<double> & A, bool inverse = false);
00466 Transform (const Matrix<double> & A, const double scale);
00467 Transform (double angle);
00468 Transform (double scaleX, double scaleY);
00469 void initialize (const Matrix<double> & A, bool inverse = false);
00470
00471 virtual Image filter (const Image & image);
00472
00473 void setPeg (float centerX = -1, float centerY = -1, int width = -1, int height = -1);
00474 void setWindow (float centerX, float centerY, int width = -1, int height = -1);
00475 void prepareResult (const Image & image, Image & result, Matrix3x3<float> & H);
00476 Transform operator * (const Transform & that) const;
00477
00478
00479
00480
00481
00482 Matrix2x2<float> IA;
00483 float translateX;
00484 float translateY;
00485
00486 bool peg;
00487 bool defaultViewport;
00488 float centerX;
00489 float centerY;
00490 int width;
00491 int height;
00492 };
00493
00494 class TransformGauss : public Transform
00495 {
00496 public:
00497 TransformGauss (const Matrix<double> & A, bool inverse = false) : Transform (A, inverse), G (GrayFloat) {needG = true;}
00498 TransformGauss (const Matrix<double> & A, const double scale) : Transform (A, scale), G (GrayFloat) {needG = true;}
00499 TransformGauss (double angle) : Transform (angle), G (GrayFloat) {needG = true;}
00500 TransformGauss (double scaleX, double scaleY) : Transform (scaleX, scaleY), G (GrayFloat) {needG = true;}
00501 TransformGauss (const Transform & that) : Transform (that), G (GrayFloat) {needG = true;}
00502 void prepareG ();
00503
00504 virtual Image filter (const Image & image);
00505
00506 ImageOf<float> G;
00507 int Gshw;
00508 int Gshh;
00509 int GstepX;
00510 int GstepY;
00511 float sigmaX;
00512 float sigmaY;
00513 bool needG;
00514 };
00515
00520 class Zoom : public Filter
00521 {
00522 public:
00523 Zoom (int scaleX, int scaleY);
00524
00525 virtual Image filter (const Image & image);
00526
00527 int scaleX;
00528 int scaleY;
00529 };
00530
00531 class Rotate180 : public Filter
00532 {
00533 public:
00534 virtual Image filter (const Image & image);
00535 };
00536
00537 class Rotate90 : public Filter
00538 {
00539 public:
00540 Rotate90 (bool clockwise = false);
00541
00542 virtual Image filter (const Image & image);
00543
00544 bool clockwise;
00545 };
00546
00547 class ClearAlpha : public Filter
00548 {
00549 public:
00550 ClearAlpha (unsigned int color = 0x0);
00551
00552 virtual Image filter (const Image & image);
00553
00554 unsigned int color;
00555 };
00556 }
00557
00558
00559 #endif