-
-
Notifications
You must be signed in to change notification settings - Fork 143
/
Copy pathfilter_utils.h
131 lines (101 loc) · 3.18 KB
/
filter_utils.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Copyright (C) 2010-2016 Lukas Lalinsky
// Distributed under the MIT license, see the LICENSE file for details.
#ifndef CHROMAPRINT_FILTER_UTILS_H_
#define CHROMAPRINT_FILTER_UTILS_H_
#include <cmath>
#include <cassert>
#include "utils.h"
namespace chromaprint {
inline double Subtract(double a, double b) {
return a - b;
}
inline double SubtractLog(double a, double b) {
double r = log((1.0 + a) / (1.0 + b));
assert(!IsNaN(r));
return r;
}
// oooooooooooooooo
// oooooooooooooooo
// oooooooooooooooo
// oooooooooooooooo
template <typename IntegralImage, typename Comparator>
double Filter0(const IntegralImage &image, size_t x, size_t y, size_t w, size_t h, Comparator cmp) {
assert(w >= 1);
assert(h >= 1);
double a = image.Area(x, y, x + w, y + h);
double b = 0;
return cmp(a, b);
}
// ................
// ................
// oooooooooooooooo
// oooooooooooooooo
template <typename IntegralImage, typename Comparator>
double Filter1(const IntegralImage &image, size_t x, size_t y, size_t w, size_t h, Comparator cmp) {
assert(w >= 1);
assert(h >= 1);
const auto h_2 = h / 2;
double a = image.Area(x, y + h_2, x + w, y + h );
double b = image.Area(x, y, x + w, y + h_2);
return cmp(a, b);
}
// .......ooooooooo
// .......ooooooooo
// .......ooooooooo
// .......ooooooooo
template <typename IntegralImage, typename Comparator>
double Filter2(const IntegralImage &image, size_t x, size_t y, size_t w, size_t h, Comparator cmp) {
assert(w >= 1);
assert(h >= 1);
const auto w_2 = w / 2;
double a = image.Area(x + w_2, y, x + w , y + h);
double b = image.Area(x, y, x + w_2, y + h);
return cmp(a, b);
}
// .......ooooooooo
// .......ooooooooo
// ooooooo.........
// ooooooo.........
template <typename IntegralImage, typename Comparator>
double Filter3(const IntegralImage &image, size_t x, size_t y, size_t w, size_t h, Comparator cmp) {
assert(x >= 0);
assert(y >= 0);
assert(w >= 1);
assert(h >= 1);
const auto w_2 = w / 2;
const auto h_2 = h / 2;
double a = image.Area(x, y + h_2, x + w_2, y + h ) +
image.Area(x + w_2, y, x + w , y + h_2);
double b = image.Area(x, y, x + w_2, y + h_2) +
image.Area(x + w_2, y + h_2, x + w , y + h );
return cmp(a, b);
}
// ................
// oooooooooooooooo
// ................
template <typename IntegralImage, typename Comparator>
double Filter4(const IntegralImage &image, size_t x, size_t y, size_t w, size_t h, Comparator cmp) {
assert(w >= 1);
assert(h >= 1);
const auto h_3 = h / 3;
double a = image.Area(x, y + h_3, x + w, y + 2 * h_3);
double b = image.Area(x, y, x + w, y + h_3) +
image.Area(x, y + 2 * h_3, x + w, y + h);
return cmp(a, b);
}
// .....oooooo.....
// .....oooooo.....
// .....oooooo.....
// .....oooooo.....
template <typename IntegralImage, typename Comparator>
double Filter5(const IntegralImage &image, size_t x, size_t y, size_t w, size_t h, Comparator cmp) {
assert(w >= 1);
assert(h >= 1);
const auto w_3 = w / 3;
double a = image.Area(x + w_3, y, x + 2 * w_3, y + h);
double b = image.Area(x, y, x + w_3, y + h) +
image.Area(x + 2 * w_3, y, x + w, y + h);
return cmp(a, b);
}
}; // namespace chromaprint
#endif