cars 1.0.0rc1__cp313-cp313-musllinux_1_2_i686.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.
- cars/__init__.py +74 -0
- cars/applications/__init__.py +37 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +104 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +630 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +655 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1460 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-i386-linux-musl.so +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +588 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +270 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +279 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +333 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_correction_app.py +496 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +527 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +531 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +634 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +762 -0
- cars/applications/resampling/resampling_algo.py +614 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +498 -0
- cars/applications/sparse_matching/sift_app.py +735 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +68 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +238 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +757 -0
- cars/cars.py +177 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1119 -0
- cars/core/geometry/shareloc_geometry.py +598 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1541 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +244 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +375 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +1075 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +873 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/orchestrator.py +905 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +2 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +786 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +417 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +69 -0
- cars/pipelines/parameters/application_parameters.py +71 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +918 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +454 -0
- cars/pipelines/parameters/sensor_inputs.py +842 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +49 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +31 -0
- cars/pipelines/pipeline_template.py +139 -0
- cars/pipelines/unit/__init__.py +26 -0
- cars/pipelines/unit/unit_pipeline.py +2850 -0
- cars/starter.py +167 -0
- cars-1.0.0rc1.dist-info/METADATA +292 -0
- cars-1.0.0rc1.dist-info/RECORD +202 -0
- cars-1.0.0rc1.dist-info/WHEEL +5 -0
- cars-1.0.0rc1.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s-1257a076.so.1 +0 -0
- cars.libs/libstdc++-0530927c.so.6.0.32 +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
|