cars 1.0.0rc2__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cars might be problematic. Click here for more details.

Files changed (225) hide show
  1. cars/__init__.py +86 -0
  2. cars/applications/__init__.py +40 -0
  3. cars/applications/application.py +117 -0
  4. cars/applications/application_constants.py +29 -0
  5. cars/applications/application_template.py +146 -0
  6. cars/applications/auxiliary_filling/__init__.py +29 -0
  7. cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
  10. cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
  11. cars/applications/dem_generation/__init__.py +30 -0
  12. cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
  13. cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
  14. cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
  15. cars/applications/dem_generation/bulldozer_memory.py +55 -0
  16. cars/applications/dem_generation/dem_generation_algo.py +107 -0
  17. cars/applications/dem_generation/dem_generation_constants.py +32 -0
  18. cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
  19. cars/applications/dense_match_filling/__init__.py +30 -0
  20. cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
  21. cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
  22. cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
  23. cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
  24. cars/applications/dense_match_filling/zero_padding_app.py +302 -0
  25. cars/applications/dense_matching/__init__.py +30 -0
  26. cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
  27. cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.dll.a +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
  31. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  32. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  33. cars/applications/dense_matching/cpp/meson.build +9 -0
  34. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  35. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  36. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  37. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  38. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  39. cars/applications/dense_matching/disparity_grid_algo.py +597 -0
  40. cars/applications/dense_matching/loaders/__init__.py +23 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  46. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  47. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  48. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  49. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  50. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  51. cars/applications/dsm_filling/__init__.py +32 -0
  52. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  53. cars/applications/dsm_filling/border_interpolation_app.py +278 -0
  54. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  55. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  56. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  57. cars/applications/dsm_merging/__init__.py +28 -0
  58. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  59. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  60. cars/applications/grid_correction/__init__.py +30 -0
  61. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  62. cars/applications/grid_correction/grid_correction_app.py +557 -0
  63. cars/applications/grid_generation/__init__.py +30 -0
  64. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  65. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  66. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  67. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  68. cars/applications/grid_generation/transform_grid.py +88 -0
  69. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  70. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  71. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  72. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  73. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  74. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  76. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  77. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  78. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  79. cars/applications/rasterization/__init__.py +30 -0
  80. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  81. cars/applications/rasterization/rasterization_algo.py +534 -0
  82. cars/applications/rasterization/rasterization_constants.py +38 -0
  83. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  84. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  85. cars/applications/resampling/__init__.py +28 -0
  86. cars/applications/resampling/abstract_resampling_app.py +187 -0
  87. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  88. cars/applications/resampling/resampling_algo.py +590 -0
  89. cars/applications/resampling/resampling_constants.py +36 -0
  90. cars/applications/resampling/resampling_wrappers.py +309 -0
  91. cars/applications/sensors_subsampling/__init__.py +32 -0
  92. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  93. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  94. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  95. cars/applications/sparse_matching/__init__.py +30 -0
  96. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  97. cars/applications/sparse_matching/sift_app.py +724 -0
  98. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  99. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  100. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  101. cars/applications/triangulation/__init__.py +32 -0
  102. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  103. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  104. cars/applications/triangulation/pc_transform.py +552 -0
  105. cars/applications/triangulation/triangulation_algo.py +371 -0
  106. cars/applications/triangulation/triangulation_constants.py +38 -0
  107. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  108. cars/bundleadjustment.py +750 -0
  109. cars/cars.py +179 -0
  110. cars/conf/__init__.py +23 -0
  111. cars/conf/geoid/egm96.grd +0 -0
  112. cars/conf/geoid/egm96.grd.hdr +15 -0
  113. cars/conf/input_parameters.py +156 -0
  114. cars/conf/mask_cst.py +35 -0
  115. cars/core/__init__.py +23 -0
  116. cars/core/cars_logging.py +402 -0
  117. cars/core/constants.py +191 -0
  118. cars/core/constants_disparity.py +50 -0
  119. cars/core/datasets.py +140 -0
  120. cars/core/geometry/__init__.py +27 -0
  121. cars/core/geometry/abstract_geometry.py +1119 -0
  122. cars/core/geometry/shareloc_geometry.py +598 -0
  123. cars/core/inputs.py +568 -0
  124. cars/core/outputs.py +176 -0
  125. cars/core/preprocessing.py +722 -0
  126. cars/core/projection.py +843 -0
  127. cars/core/roi_tools.py +215 -0
  128. cars/core/tiling.py +774 -0
  129. cars/core/utils.py +164 -0
  130. cars/data_structures/__init__.py +23 -0
  131. cars/data_structures/cars_dataset.py +1544 -0
  132. cars/data_structures/cars_dict.py +74 -0
  133. cars/data_structures/corresponding_tiles_tools.py +186 -0
  134. cars/data_structures/dataframe_converter.py +185 -0
  135. cars/data_structures/format_transformation.py +297 -0
  136. cars/devibrate.py +689 -0
  137. cars/extractroi.py +264 -0
  138. cars/orchestrator/__init__.py +23 -0
  139. cars/orchestrator/achievement_tracker.py +125 -0
  140. cars/orchestrator/cluster/__init__.py +37 -0
  141. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  142. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  143. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  144. cars/orchestrator/cluster/dask_config/README.md +94 -0
  145. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  146. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  147. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  152. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  153. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  154. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  155. cars/orchestrator/cluster/log_wrapper.py +728 -0
  156. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  160. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  162. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  163. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  164. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  165. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  166. cars/orchestrator/memory_tools.py +47 -0
  167. cars/orchestrator/orchestrator.py +755 -0
  168. cars/orchestrator/orchestrator_constants.py +29 -0
  169. cars/orchestrator/registry/__init__.py +23 -0
  170. cars/orchestrator/registry/abstract_registry.py +143 -0
  171. cars/orchestrator/registry/compute_registry.py +106 -0
  172. cars/orchestrator/registry/id_generator.py +116 -0
  173. cars/orchestrator/registry/replacer_registry.py +213 -0
  174. cars/orchestrator/registry/saver_registry.py +363 -0
  175. cars/orchestrator/registry/unseen_registry.py +118 -0
  176. cars/orchestrator/tiles_profiler.py +279 -0
  177. cars/pipelines/__init__.py +26 -0
  178. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  179. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  180. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  181. cars/pipelines/default/__init__.py +26 -0
  182. cars/pipelines/default/default_pipeline.py +1088 -0
  183. cars/pipelines/filling/__init__.py +26 -0
  184. cars/pipelines/filling/filling.py +981 -0
  185. cars/pipelines/formatting/__init__.py +26 -0
  186. cars/pipelines/formatting/formatting.py +186 -0
  187. cars/pipelines/merging/__init__.py +26 -0
  188. cars/pipelines/merging/merging.py +439 -0
  189. cars/pipelines/parameters/__init__.py +0 -0
  190. cars/pipelines/parameters/advanced_parameters.py +256 -0
  191. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  192. cars/pipelines/parameters/application_parameters.py +72 -0
  193. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  194. cars/pipelines/parameters/dsm_inputs.py +349 -0
  195. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  196. cars/pipelines/parameters/output_constants.py +52 -0
  197. cars/pipelines/parameters/output_parameters.py +438 -0
  198. cars/pipelines/parameters/sensor_inputs.py +859 -0
  199. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  200. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  202. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  204. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  206. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  207. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  208. cars/pipelines/pipeline.py +119 -0
  209. cars/pipelines/pipeline_constants.py +38 -0
  210. cars/pipelines/pipeline_template.py +135 -0
  211. cars/pipelines/subsampling/__init__.py +26 -0
  212. cars/pipelines/subsampling/subsampling.py +358 -0
  213. cars/pipelines/surface_modeling/__init__.py +26 -0
  214. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  215. cars/pipelines/tie_points/__init__.py +26 -0
  216. cars/pipelines/tie_points/tie_points.py +536 -0
  217. cars/starter.py +167 -0
  218. cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
  219. cars-1.0.0rc2.dist-info/METADATA +289 -0
  220. cars-1.0.0rc2.dist-info/RECORD +225 -0
  221. cars-1.0.0rc2.dist-info/WHEEL +4 -0
  222. cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
  223. cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
  224. cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
  225. cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
@@ -0,0 +1,297 @@
1
+ #!/usr/bin/env python
2
+ # coding: utf8
3
+ #
4
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
5
+ #
6
+ # This file is part of CARS
7
+ # (see https://github.com/CNES/cars).
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+ #
21
+ """
22
+ Contains function for format transformation between region and windows:
23
+ """
24
+
25
+ # Third party imports
26
+
27
+ # Standard imports
28
+ import math
29
+
30
+ import numpy as np
31
+ import xarray as xr
32
+
33
+ from cars.orchestrator.cluster.log_wrapper import cars_profile
34
+
35
+ # CARS imports
36
+
37
+
38
+ @cars_profile(name="Grid margins 2 overlaps", interval=0.5)
39
+ def grid_margins_2_overlaps(grid, margins_fun):
40
+ """
41
+ Convert margins to overlap grid format used in CarsDatasets
42
+
43
+ :param grid: region grid
44
+ :type grid: np.ndarray
45
+ :param margins_fun: function to compute margis
46
+ :type margins_fun: fun
47
+
48
+
49
+ :return: overlap grid left, overlap grid right
50
+ :rtype: np.ndarray, np.ndarray
51
+
52
+ """
53
+
54
+ def fill_overlap( # pylint: disable=too-many-positional-arguments
55
+ cars_ds_overlaps,
56
+ margins,
57
+ row_up,
58
+ row_max,
59
+ row_down,
60
+ col_left,
61
+ col_max,
62
+ col_right,
63
+ ):
64
+ """
65
+ Fill overlap arrays for given margins
66
+ """
67
+ # margins : pandora convention : ['left','up', 'right', 'down']
68
+ overlap_row_up = abs(math.floor(margins[1]))
69
+ overlap_row_down = abs(math.ceil(margins[3]))
70
+ overlap_col_left = abs(math.floor(margins[0]))
71
+ overlap_col_right = abs(math.ceil(margins[2]))
72
+
73
+ # fill overlap [OL_row_up, OL_row_down, OL_col_left,
74
+ # OL_col_right]
75
+ cars_ds_overlaps[i, j, 0] = row_up - max(0, row_up - overlap_row_up)
76
+ cars_ds_overlaps[i, j, 1] = (
77
+ min(row_max, row_down + overlap_row_down) - row_down
78
+ )
79
+
80
+ cars_ds_overlaps[i, j, 2] = col_left - max(
81
+ 0, col_left - overlap_col_left
82
+ )
83
+ cars_ds_overlaps[i, j, 3] = (
84
+ min(col_max, col_right + overlap_col_right) - col_right
85
+ )
86
+
87
+ nb_rows, nb_cols = grid.shape[0], grid.shape[1]
88
+
89
+ cars_ds_overlaps_left = np.ndarray(shape=(nb_rows, nb_cols, 4), dtype=float)
90
+ cars_ds_overlaps_right = np.ndarray(
91
+ shape=(nb_rows, nb_cols, 4), dtype=float
92
+ )
93
+ used_disp_min = np.full((nb_rows, nb_cols), 0)
94
+ used_disp_max = np.full((nb_rows, nb_cols), 0)
95
+
96
+ row_max = np.max(grid[:, :, 1])
97
+ col_max = np.max(grid[:, :, 3])
98
+
99
+ for j in range(0, nb_cols):
100
+ for i in range(0, nb_rows):
101
+ row_up = grid[i, j, 0]
102
+ row_down = grid[i, j, 1]
103
+ col_left = grid[i, j, 2]
104
+ col_right = grid[i, j, 3]
105
+
106
+ margins_dataset = margins_fun(row_up, row_down, col_left, col_right)
107
+ margins_left = margins_dataset["left_margin"]
108
+ margins_right = margins_dataset["right_margin"]
109
+ if "disp_min" in margins_dataset.attrs:
110
+ if margins_dataset.attrs["disp_min"] is not None:
111
+ used_disp_min[i, j] = margins_dataset.attrs["disp_min"]
112
+ if margins_dataset.attrs["disp_max"] is not None:
113
+ used_disp_max[i, j] = margins_dataset.attrs["disp_max"]
114
+
115
+ # fill left
116
+ fill_overlap(
117
+ cars_ds_overlaps_left,
118
+ margins_left,
119
+ row_up,
120
+ row_max,
121
+ row_down,
122
+ col_left,
123
+ col_max,
124
+ col_right,
125
+ )
126
+ # fill right
127
+ fill_overlap(
128
+ cars_ds_overlaps_right,
129
+ margins_right,
130
+ row_up,
131
+ row_max,
132
+ row_down,
133
+ col_left,
134
+ col_max,
135
+ col_right,
136
+ )
137
+
138
+ return (
139
+ cars_ds_overlaps_left,
140
+ cars_ds_overlaps_right,
141
+ used_disp_min,
142
+ used_disp_max,
143
+ )
144
+
145
+
146
+ def get_corresponding_indexes(row, col):
147
+ """
148
+ Get point cloud tiling grid indexes, corresponding to
149
+ given raster indexes.
150
+ In rasterio convention.
151
+
152
+ :param row: row
153
+ :type row: int
154
+ :param col: col
155
+ :type col: int
156
+
157
+ :return: corresponding indexes (row, col)
158
+ :rtype: tuple(int, int)
159
+
160
+ """
161
+
162
+ pc_row = col
163
+ pc_col = row
164
+
165
+ return pc_row, pc_col
166
+
167
+
168
+ def terrain_coords_to_pix(point_cloud_cars_ds, resolution):
169
+ """
170
+ Compute the tiling grid in pixels, from a tiling grid in
171
+ geocoordinates
172
+
173
+ :param point_cloud_cars_ds: point clouds
174
+ :type point_cloud_cars_ds: CarsDataset
175
+ :param resolution: resolution
176
+ :type resolution: float
177
+
178
+ :return: new tiling grid
179
+ :rtype: np.ndarray
180
+
181
+ """
182
+
183
+ raster_tiling_grid = np.empty(
184
+ point_cloud_cars_ds.tiling_grid.shape
185
+ ).transpose(1, 0, 2)
186
+
187
+ for row in range(raster_tiling_grid.shape[0]):
188
+ for col in range(raster_tiling_grid.shape[1]):
189
+ # get corresponding tile in point cloud
190
+ pc_row, pc_col = get_corresponding_indexes(row, col)
191
+
192
+ # Get window
193
+ window_dict = point_cloud_cars_ds.get_window_as_dict(
194
+ pc_row,
195
+ pc_col,
196
+ from_terrain=True,
197
+ resolution=resolution,
198
+ )
199
+
200
+ # apply window
201
+ raster_tiling_grid[row, col, :] = [
202
+ window_dict["row_min"],
203
+ window_dict["row_max"],
204
+ window_dict["col_min"],
205
+ window_dict["col_max"],
206
+ ]
207
+
208
+ return raster_tiling_grid
209
+
210
+
211
+ def region_margins_from_window(
212
+ window,
213
+ left_overlaps,
214
+ right_overlaps,
215
+ used_disp_min=None,
216
+ used_disp_max=None,
217
+ ):
218
+ """
219
+ Convert window to margins. Add used disp min and max used for resampling
220
+
221
+ :param window: window to use
222
+ :type window: Dict
223
+ :param left_overlaps: left overlap to use
224
+ :type left_overlaps: Dict
225
+ :param right_overlaps: right overlap to use
226
+ :type right_overlaps: Dict
227
+ :param used_disp_min: min disp min used in resampling
228
+ :param used_disp_max: max disp max used in resampling
229
+
230
+
231
+ :return: Region, Margin
232
+ :rtype: Tuple(List, List)
233
+
234
+ """
235
+
236
+ # margin : 'left', 'up', 'right', 'down'
237
+
238
+ left_margin = [
239
+ abs(left_overlaps["left"]),
240
+ abs(left_overlaps["up"]),
241
+ abs(left_overlaps["right"]),
242
+ abs(left_overlaps["down"]),
243
+ ]
244
+
245
+ right_margin = [
246
+ abs(right_overlaps["left"]),
247
+ abs(right_overlaps["up"]),
248
+ abs(right_overlaps["right"]),
249
+ abs(right_overlaps["down"]),
250
+ ]
251
+
252
+ # Generate margin dataset
253
+ corner = ["left", "up", "right", "down"]
254
+ col = np.arange(len(corner))
255
+ margin = xr.Dataset(
256
+ {
257
+ "left_margin": (["col"], np.array(left_margin)),
258
+ "right_margin": (["col"], np.array(right_margin)),
259
+ },
260
+ coords={"col": col},
261
+ )
262
+
263
+ # add disp min and max
264
+ margin.attrs["disp_min"] = used_disp_min
265
+ margin.attrs["disp_max"] = used_disp_max
266
+
267
+ # region : xmin, ymin, xmax, ymax
268
+ # window : row_min, row_max, col_min, col_max
269
+
270
+ region = [
271
+ window["col_min"],
272
+ window["row_min"],
273
+ window["col_max"],
274
+ window["row_max"],
275
+ ]
276
+
277
+ return region, margin
278
+
279
+
280
+ def reduce_overlap(current_overlaps, new_margin):
281
+ """
282
+ Reduce overlap with margin
283
+
284
+ :param current_overlaps: overlap array
285
+ :type current_overlaps: np.ndarray
286
+ :param new_margin: margin to use
287
+ :type new_margin: int
288
+
289
+ :return: new overlap array
290
+ """
291
+
292
+ new_overlap = np.full(current_overlaps.shape, new_margin)
293
+
294
+ # The new overlap cannot be more than current
295
+ new_overlap = np.clip(new_overlap, 0, current_overlaps)
296
+
297
+ return new_overlap