|
13 | 13 | #include "definitions.h"
|
14 | 14 | #include "vectors.h"
|
15 | 15 |
|
16 |
| - |
17 |
| -template <typename Derived, typename Derived2> |
18 |
| -auto minmax_kernel(const Derived &block, const Derived2 &kernel) { |
19 |
| - static_assert(std::is_same_v<typename Derived2::value_type, bool>); |
20 |
| - assert(kernel.shape() == block.shape()); |
21 |
| - |
22 |
| - using Scalar = typename Derived::value_type; |
23 |
| - Scalar max = std::numeric_limits<Scalar>::lowest(); |
24 |
| - Scalar min = std::numeric_limits<Scalar>::max(); |
25 |
| - |
26 |
| - for (size_t row = 0; row < kernel.shape(0); row++) { |
27 |
| - for (size_t col = 0; col < kernel.shape(1); col++) { |
28 |
| - if (kernel(row, col)) { |
29 |
| - max = std::max(max, block(row, col)); |
30 |
| - min = std::min(min, block(row, col)); |
31 |
| - } |
32 |
| - } |
33 |
| - } |
34 |
| - return std::make_pair(min, max); |
35 |
| -} |
36 |
| - |
37 | 16 | template <typename Derived, typename Derived2, typename Derived3>
|
38 |
| -auto minmax_kernel_masked(const Derived &block, const Derived2 &kernel, const Derived3 &mask) { |
| 17 | +auto minmax_kernel(const Derived &block, const Derived2 &kernel, const Derived3 &mask) { |
39 | 18 | assert(kernel.shape() == block.shape());
|
40 | 19 | static_assert(std::is_same_v<typename Derived2::value_type, bool>);
|
41 |
| - static_assert(std::is_same_v<typename Derived2::value_type, typename Derived3::value_type>); |
| 20 | + static_assert(std::is_same_v<typename Derived3::value_type, bool>); |
42 | 21 |
|
43 | 22 | using Scalar = typename Derived::value_type;
|
44 | 23 | Scalar max = std::numeric_limits<Scalar>::lowest();
|
45 | 24 | Scalar min = std::numeric_limits<Scalar>::max();
|
46 | 25 |
|
47 | 26 | for (size_t row = 0; row < kernel.shape(0); row++) {
|
48 | 27 | for (size_t col = 0; col < kernel.shape(1); col++) {
|
49 |
| - if (kernel(row, col) && mask(row, col)) { |
| 28 | + bool in_mask = mask.size() <= 1 || mask(row, col); |
| 29 | + if (kernel(row, col) && in_mask) { |
50 | 30 | max = std::max(max, block(row, col));
|
51 | 31 | min = std::min(min, block(row, col));
|
52 | 32 | }
|
53 | 33 | }
|
54 | 34 | }
|
| 35 | + |
| 36 | + if (max == std::numeric_limits<Scalar>::lowest() || min == std::numeric_limits<Scalar>::max()) { |
| 37 | + max = 0; |
| 38 | + min = 0; |
| 39 | + } |
55 | 40 | return std::make_pair(min, max);
|
56 | 41 | }
|
57 | 42 |
|
@@ -158,15 +143,11 @@ void _contrast_enhancement_padded(T &out,
|
158 | 143 |
|
159 | 144 | const auto block = xt::view(img, xt::range(startx, endx), xt::range(starty, endy));
|
160 | 145 | const auto kernel_block = xt::view(kernel, xt::range(mstartx, mendx), xt::range(mstarty, mendy));
|
| 146 | + const auto mask_block = (mask.size() > 1)? xt::view(mask, xt::range(startx, endx), xt::range(starty, endy)) : Array2b(); |
161 | 147 |
|
162 |
| - float min, max; |
163 |
| - if (mask.size() > 1) { |
164 |
| - const auto mask_block = xt::view(mask, xt::range(startx, endx), xt::range(starty, endy)); |
165 |
| - std::tie(min, max) = minmax_kernel_masked(block, kernel_block, mask_block); |
166 |
| - } else { |
167 |
| - std::tie(min, max) = minmax_kernel(block, kernel_block); |
168 |
| - } |
169 |
| - if (max != min) { |
| 148 | + const bool in_mask = mask.size() <= 1 || mask(row, col); |
| 149 | + auto [min, max] = minmax_kernel(block, kernel_block, mask_block); |
| 150 | + if (max != min && in_mask) { |
170 | 151 | out(row, col) = (img(row, col) - min) / (max - min);
|
171 | 152 | } else {
|
172 | 153 | out(row, col) = 0;
|
|
0 commit comments