targeter  1
software for EUCALL WP6 deliverable - pre-investigation of XFEL targets
openCVtrilateralFilter.h
1 #ifndef FILE_openCVtrilateralFilter_h
2 #define FILE_openCVtrilateralFilter_h
3 
4 #include <math.h>
5 #include <opencv/cxcore.h>
6 #include <vector>
7 using std::vector;
8 
9 
11 {
12 public:
15 
16  // Types for filter
17  enum{TYPE_LUT, TYPE_FAST};
18 
19  bool trilateralFilter(cv::Mat& input, cv::Mat& output, const float sigmaC, const float epsilon,
20  const int filterType = TYPE_FAST);
21 
22  cv::Mat trilateralFilter(cv::Mat& input, const float sigmaC, const float epsilon, const int filterType = TYPE_FAST)
23  {
24  cv::Mat output = cv::Mat( input.rows, input.cols, input.depth(), cv::Scalar(1));
25  if ( trilateralFilter(input, output, sigmaC, epsilon, filterType) )
26  {
27  return output;
28  }
29 
30  };
31 
32 private:
33 
34  //Computes X and Y gradients of the input image
35  void computeGradients(
36  cv::Mat& inputImg, // inputs
37  cv::Mat& xGradient, cv::Mat& yGradient); // outputs
38 
39  // Compute image magnitude
40  void computeMagnitude(
41  cv::Mat& xGradient, cv::Mat& yGradient, // inputs
42  cv::Mat& gradientMagnitude); // output
43 
44  //Finds the adaptive neighborhood size (stack level)
45  //from the min-max gradient stack
46  void setAdaptiveNeighbourHood(
47  cv::Mat& gradientMagnitude, // inputs
48  const float sigmaR, const int maxLevel,
49  cv::Mat& adaptiveNeighbourhood ); // output
50 
51  //Builds the stack of min-max image gradient magnitudes
52  void buildMinMaxImageStack(
53  cv::Mat& gradientMagnitude, // input
54  vector<cv::Mat> minStack, vector<cv::Mat> maxStack ); // outputs
55 
56  // Fast-Trilateral functions
57 
58  //Bilaterally filters gradients pX and pY
59  void BilateralGradientFilter(
60  cv::Mat& xGradient, cv::Mat& yGradient, // inputs
61  cv::Mat& gradientMagnitude, const float sigmaC,
62  const float sigmaR, const float epsilon,
63  cv::Mat& xGradientSmooth, cv::Mat& yGradientSmooth ); // outputs
64 
65  //Filters the detail signal and computes the final output image
66  void DetailBilateralFilter(
67  cv::Mat& inputImage, cv::Mat& adaptiveRegion, //inputs
68  cv::Mat& xGradientSmooth, cv::Mat& yGradientSmooth,
69  const float sigmaC, const float sigmaR,
70  const int maxDomainSize, const float epsilon,
71  cv::Mat& outputImg); // output
72 
73 
74  // LUT-Trilateral functions
75 
76  void BilateralGradientFilterLUT(
77  cv::Mat& xGradient, cv::Mat& yGradient, // inputs
78  cv::Mat& gradientMagnitude,
79  const float sigmaC, const float sigmaR,
80  cv::Mat& xGradientSmooth, cv::Mat& yGradientSmooth ); // outputs
81 
82  void DetailBilateralFilterLUT(
83  cv::Mat& inputImage, cv::Mat& adaptiveRegion, // inputs
84  cv::Mat& xGradientSmooth, cv::Mat& yGradientSmooth,
85  const float sigmaC, const float sigmaR, const int maxDomainSize,
86  cv::Mat& outputImg); // output
87 
88 
89  inline float getNorm(float g1, float g2)
90  {
91  return (float) sqrt( (float) ( pow(g1,2) + pow(g2,2) ) );
92  }
93 
94  inline int log2(int input, bool roundUp = false)
95  {
96  float temp = log10( float(input) ) / log10(2.f);
97  if (roundUp)
98  return int( ceil(temp) );
99  else
100  return int( temp );
101  }
102 
103 };
104 
105 #endif // FILE_openCVtrilateralFilter_h