|
7 | 7 | import numpy as np |
8 | 8 |
|
9 | 9 | from .basic_module import BasicModule, register_dependent_modules |
10 | | -from .helpers import bilateral_filter, gen_gaussian_kernel |
| 10 | +from .helpers import gaussian_filter, gen_gaussian_kernel |
11 | 11 |
|
12 | 12 |
|
13 | 13 | @register_dependent_modules('csc') |
14 | 14 | class EEH(BasicModule): |
15 | 15 | def __init__(self, cfg): |
16 | 16 | super().__init__(cfg) |
17 | 17 |
|
18 | | - self.intensity_weights_lut = self.get_intensity_weights_lut(intensity_sigma=1.0) # x1024 |
19 | | - spatial_weights = gen_gaussian_kernel(kernel_size=5, sigma=1.0) |
20 | | - self.spatial_weights = (1024 * spatial_weights / spatial_weights.max()).astype(np.int32) # x1024 |
| 18 | + kernel = gen_gaussian_kernel(kernel_size=7, sigma=5.0) |
| 19 | + self.kernel = (1024 * kernel / kernel.max()).astype(np.int32) # x1024 |
21 | 20 |
|
22 | 21 | flat_slope = self.params.middle_threshold / (self.params.middle_threshold - self.params.flat_threshold + 1E-6) |
23 | 22 | edge_slope = self.params.edge_gain / 256 |
24 | 23 |
|
25 | 24 | self.flat_slope = np.array(256 * flat_slope, dtype=np.int32) # x256 |
26 | 25 | self.edge_slope = np.array(256 * edge_slope, dtype=np.int32) # x256 |
27 | | - self.flat_intercept = np.array(-flat_slope * self.params.flat_threshold, dtype=np.int32) |
28 | | - self.edge_intercept = np.array((1 - edge_slope) * self.params.edge_threshold, dtype=np.int32) |
| 26 | + self.flat_intercept = -np.array(256 * flat_slope * self.params.flat_threshold, dtype=np.int32) # x256 |
| 27 | + self.edge_intercept = np.array(256 * (1 - edge_slope) * self.params.edge_threshold, dtype=np.int32) # x256 |
29 | 28 |
|
30 | 29 | def execute(self, data): |
31 | 30 | y_image = data['y_image'].astype(np.int32) |
32 | 31 |
|
33 | | - bf_y_image = bilateral_filter(y_image, self.spatial_weights, self.intensity_weights_lut, right_shift=10) |
| 32 | + gf_y_image = gaussian_filter(y_image, self.kernel) |
34 | 33 |
|
35 | | - delta = y_image - bf_y_image |
| 34 | + delta = y_image - gf_y_image |
36 | 35 | sign_map = np.sign(delta) |
37 | 36 | abs_delta = np.abs(delta) |
38 | 37 |
|
39 | | - flat_delta = np.right_shift(self.flat_slope * abs_delta, 8) + self.flat_intercept |
40 | | - edge_delta = np.right_shift(self.edge_slope * abs_delta, 8) + self.edge_intercept |
| 38 | + flat_delta = np.right_shift(self.flat_slope * abs_delta + self.flat_intercept, 8) |
| 39 | + edge_delta = np.right_shift(self.edge_slope * abs_delta + self.edge_intercept, 8) |
41 | 40 | enhanced_delta = sign_map * ( |
42 | 41 | (abs_delta > self.params.flat_threshold) * (abs_delta <= self.params.middle_threshold) * flat_delta + |
43 | 42 | (abs_delta > self.params.middle_threshold) * (abs_delta <= self.params.edge_threshold) * abs_delta + |
44 | 43 | (abs_delta > self.params.edge_threshold) * edge_delta |
45 | 44 | ) |
46 | 45 | enhanced_delta = np.clip(enhanced_delta, -self.params.delta_threshold, self.params.delta_threshold) |
47 | 46 |
|
48 | | - eeh_y_image = np.clip(bf_y_image + enhanced_delta, 0, self.cfg.saturation_values.sdr) |
| 47 | + eeh_y_image = np.clip(gf_y_image + enhanced_delta, 0, self.cfg.saturation_values.sdr) |
49 | 48 |
|
50 | 49 | data['y_image'] = eeh_y_image.astype(np.uint8) |
51 | 50 | data['edge_map'] = delta |
52 | | - |
53 | | - @staticmethod |
54 | | - def get_intensity_weights_lut(intensity_sigma): |
55 | | - intensity_diff = np.arange(255 ** 2) |
56 | | - exp_lut = 1024 * np.exp(-intensity_diff / (2.0 * (255 * intensity_sigma) ** 2)) |
57 | | - return exp_lut.astype(np.int32) # x1024 |
58 | | - |
0 commit comments