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,242 @@
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
+ this module contains the abstract dense matches filling application class.
23
+ """
24
+ import logging
25
+ import os
26
+ from abc import ABCMeta, abstractmethod
27
+ from typing import Dict
28
+
29
+ import numpy as np
30
+
31
+ from cars.applications.application import Application
32
+ from cars.applications.application_template import ApplicationTemplate
33
+ from cars.core import constants as cst
34
+ from cars.core import constants_disparity as cst_disp
35
+ from cars.core.utils import safe_makedirs
36
+ from cars.data_structures import cars_dataset
37
+
38
+
39
+ @Application.register("dense_match_filling")
40
+ class DenseMatchFilling(ApplicationTemplate, metaclass=ABCMeta):
41
+ """
42
+ DenseMatchFilling
43
+ """
44
+
45
+ available_applications: Dict = {}
46
+ default_application = "zero_padding"
47
+
48
+ def __new__(cls, conf=None): # pylint: disable=W0613
49
+ """
50
+ Return the required application
51
+ :raises:
52
+ - KeyError when the required application is not registered
53
+
54
+ :param conf: configuration for matching
55
+ :return: a application_to_use object
56
+ """
57
+
58
+ fill_method = cls.default_application
59
+ if bool(conf) is False or "method" not in conf:
60
+ logging.info(
61
+ "dense_match_filling method not specified, "
62
+ "default {} is used".format(fill_method)
63
+ )
64
+ else:
65
+ fill_method = conf.get("method", cls.default_application)
66
+
67
+ if fill_method not in cls.available_applications:
68
+ logging.error(
69
+ "No DenseMatchFilling application "
70
+ "named {} registered".format(fill_method)
71
+ )
72
+ raise KeyError(
73
+ "No DenseMatchFilling application"
74
+ " named {} registered".format(fill_method)
75
+ )
76
+
77
+ logging.info(
78
+ "The DenseMatchFilling({}) application "
79
+ "will be used".format(fill_method)
80
+ )
81
+
82
+ return super(DenseMatchFilling, cls).__new__(
83
+ cls.available_applications[fill_method]
84
+ )
85
+
86
+ def __init_subclass__(cls, short_name, **kwargs): # pylint: disable=E0302
87
+ super().__init_subclass__(**kwargs)
88
+ # init orchestrator
89
+ cls.orchestrator = None
90
+
91
+ # init classification
92
+ cls.classification = None
93
+
94
+ for name in short_name:
95
+ cls.available_applications[name] = cls
96
+
97
+ @abstractmethod
98
+ def get_poly_margin(self):
99
+ """
100
+ Get the margin used for polygon
101
+
102
+ :return: self.nb_pix
103
+ :rtype: int
104
+ """
105
+
106
+ def get_classif(self):
107
+ """
108
+ Get classification band list
109
+ :return: self.classification
110
+ :rtype: list[str]
111
+ """
112
+
113
+ classif = []
114
+ if self.classification is not None:
115
+ classif = self.classification
116
+
117
+ return classif
118
+
119
+ @abstractmethod
120
+ def run(
121
+ self,
122
+ epipolar_disparity_map,
123
+ **kwargs,
124
+ ):
125
+ """
126
+ Run filling application.
127
+
128
+ :param epipolar_disparity_map: left disparity
129
+ :type epipolar_disparity_map: CarsDataset
130
+
131
+ :return: filled disparity map: \
132
+ The CarsDataset contains:
133
+
134
+ - N x M Delayed tiles.\
135
+ Each tile will be a future xarray Dataset containing:
136
+ - data with keys : "disp", "disp_msk"
137
+ - attrs with keys: profile, window, overlaps
138
+ - attributes containing:
139
+ "largest_epipolar_region","opt_epipolar_tile_size",
140
+ "epipolar_regions_grid"
141
+
142
+ :rtype: CarsDataset
143
+
144
+ """
145
+
146
+ def __register_dataset__( # pylint: disable=too-many-positional-arguments
147
+ self,
148
+ epipolar_disparity_map,
149
+ save_intermediate_data,
150
+ pair_folder,
151
+ pair_key,
152
+ app_name=None,
153
+ nodata_epi_disp=0,
154
+ ):
155
+ """
156
+ Create dataset and registered the output in the orchestrator
157
+
158
+ :param epipolar_disparity_map: left disparity
159
+ :type epipolar_disparity_map: CarsDataset
160
+ :param save_intermediate_data: true to save disparity map
161
+ :type save_intermediate_data: bool
162
+ :param pair_folder: path to folder
163
+ :type pair_folder: str
164
+ :param pair_key: pair id
165
+ :type pair_key: str
166
+ :param app_name: application name for file names
167
+ :type app_name: str
168
+ :param nodata_epi_disp: the nodata for the epi disp
169
+ :type nodata_epi_disp: int
170
+
171
+ """
172
+ if app_name is None:
173
+ app_name = ""
174
+
175
+ # Create CarsDataset Epipolar_disparity
176
+ new_epipolar_disparity_map = cars_dataset.CarsDataset(
177
+ "arrays",
178
+ name="dense_match_filling_" + app_name + "_" + pair_key,
179
+ )
180
+ new_epipolar_disparity_map.create_empty_copy(epipolar_disparity_map)
181
+
182
+ # Update attributes to get epipolar info
183
+ new_epipolar_disparity_map.attributes.update(
184
+ epipolar_disparity_map.attributes
185
+ )
186
+
187
+ # Save intermediate data (disparity maps)
188
+ if save_intermediate_data:
189
+ safe_makedirs(pair_folder)
190
+ self.orchestrator.add_to_save_lists(
191
+ os.path.join(
192
+ pair_folder, "epi_disp_" + app_name + "_filled.tif"
193
+ ),
194
+ cst_disp.MAP,
195
+ new_epipolar_disparity_map,
196
+ cars_ds_name="epi_disp_" + app_name + "_filled",
197
+ nodata=nodata_epi_disp,
198
+ )
199
+
200
+ self.orchestrator.add_to_save_lists(
201
+ os.path.join(
202
+ pair_folder,
203
+ "epi_disp_color_" + app_name + "_filled.tif",
204
+ ),
205
+ cst.EPI_TEXTURE,
206
+ new_epipolar_disparity_map,
207
+ cars_ds_name="epi_disp_color_" + app_name + "_filled",
208
+ )
209
+
210
+ self.orchestrator.add_to_save_lists(
211
+ os.path.join(
212
+ pair_folder,
213
+ "epi_disp_mask_" + app_name + "_filled.tif",
214
+ ),
215
+ cst_disp.VALID,
216
+ new_epipolar_disparity_map,
217
+ dtype=np.uint8,
218
+ cars_ds_name="epi_disp_mask_" + app_name + "_filled",
219
+ )
220
+
221
+ self.orchestrator.add_to_save_lists(
222
+ os.path.join(
223
+ pair_folder,
224
+ "epi_confidence_" + app_name + "_filled.tif",
225
+ ),
226
+ cst_disp.CONFIDENCE,
227
+ new_epipolar_disparity_map,
228
+ cars_ds_name="epi_ambiguity_" + app_name + "_filled",
229
+ )
230
+
231
+ self.orchestrator.add_to_save_lists(
232
+ os.path.join(
233
+ pair_folder,
234
+ "epi_disp_filling_" + app_name + ".tif",
235
+ ),
236
+ cst_disp.FILLING,
237
+ new_epipolar_disparity_map,
238
+ dtype=np.uint8,
239
+ cars_ds_name="epi_disp_filling_" + app_name,
240
+ )
241
+
242
+ return new_epipolar_disparity_map
@@ -0,0 +1,113 @@
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
+ # pylint: disable=too-many-lines
21
+ """
22
+ This module is responsible for the filling disparity algorithms:
23
+ thus it fills the disparity map with values estimated according to
24
+ their neighbourhood.
25
+ """
26
+
27
+ # Standard imports
28
+
29
+
30
+ import numpy as np
31
+
32
+ # Third party imports
33
+ import xarray as xr
34
+
35
+ from cars.applications.dense_match_filling import (
36
+ fill_disp_wrappers as fill_wrap,
37
+ )
38
+
39
+ # Cars import
40
+ from cars.core import constants as cst
41
+
42
+
43
+ def classif_to_stacked_array(disp_map, class_index):
44
+ """
45
+ Convert disparity dataset to mask correspoding to all classes
46
+
47
+ :param disp_map: disparity dataset
48
+ :type disp_map: xarray Dataset
49
+ :param class_index: classification tags
50
+ :type class_index: list of str
51
+
52
+ """
53
+
54
+ index_class = np.where(
55
+ np.isin(
56
+ np.array(disp_map.coords[cst.BAND_CLASSIF].values),
57
+ np.array(class_index),
58
+ )
59
+ )[0].tolist()
60
+ # get index for each band classification of the non zero values
61
+ stack_index = np.any(
62
+ disp_map[cst.EPI_CLASSIFICATION].values[index_class, :, :] > 0,
63
+ axis=0,
64
+ )
65
+
66
+ return stack_index
67
+
68
+
69
+ def fill_disp_using_zero_padding(
70
+ disp_map: xr.Dataset,
71
+ classif_tag,
72
+ fill_valid_pixels,
73
+ ) -> xr.Dataset:
74
+ """
75
+ Fill disparity map holes
76
+
77
+ :param disp_map: disparity map
78
+ :type disp_map: xr.Dataset
79
+ :param classif_tag: classification tags
80
+ :type classif_tag: list
81
+ :param fill_valid_pixels: option to fill valid pixels
82
+ :type fill_valid_pixels: bool
83
+ """
84
+
85
+ # get index of the application class config
86
+ # according the coords classif band
87
+ if cst.BAND_CLASSIF in disp_map.coords or "nodata" in classif_tag:
88
+ # get index for each band classification
89
+ if classif_tag != ["nodata"]:
90
+ stack_index = classif_to_stacked_array(disp_map, classif_tag)
91
+ else:
92
+ stack_index = np.zeros(disp_map[cst.EPI_MSK].values.shape)
93
+ if "nodata" in classif_tag:
94
+ nodata_mask = np.logical_or(
95
+ disp_map[cst.EPI_MSK].values != 0,
96
+ np.isnan(disp_map["disp"].values),
97
+ )
98
+ stack_index = np.logical_or(stack_index, nodata_mask)
99
+
100
+ # Exclude pixels invalid in epipolar mask
101
+ mask = disp_map[cst.EPI_MSK].values == 0
102
+
103
+ if not fill_valid_pixels:
104
+ # Exclude valid pixels
105
+ mask = np.logical_and(mask, disp_map["disp_msk"].values == 0)
106
+ stack_index = np.logical_and(stack_index, mask)
107
+ # set disparity value to zero where the class is
108
+ # non zero value and masked region
109
+ disp_map["disp"].values[stack_index] = 0
110
+ disp_map["disp_msk"].values[stack_index] = 255
111
+ disp_map[cst.EPI_MSK].values[stack_index] = 0
112
+ # Add a band to disparity dataset to memorize which pixels are filled
113
+ fill_wrap.update_filling(disp_map, stack_index, "zeros_padding")
@@ -0,0 +1,39 @@
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
+ this module contains the constants of fill_disp.
23
+ """
24
+
25
+
26
+ # USED VARIABLES
27
+
28
+ FILL_DISP_WITH_PLAN_RUN_TAG = "fill_disparity_with_plan"
29
+ FILL_DISP_WITH_ZEROS_RUN_TAG = "fill_disparity_with_zeros"
30
+
31
+ # PARAMS
32
+ METHOD = "method" # default : 'plane'
33
+ INTERP_TYPE = "interpolation_type"
34
+ INTERP_METHOD = "interpolation_method"
35
+ MAX_DIST = "max_search_distance"
36
+ SMOOTH_IT = "smoothing_iterations"
37
+ IGNORE_NODATA = "ignore_nodata_at_disp_mask_borders"
38
+ IGNORE_ZERO = "ignore_zero_fill_disp_mask_values"
39
+ IGNORE_EXTREMA = "ignore_extrema_disp_values"
@@ -0,0 +1,83 @@
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
+ # pylint: disable=too-many-lines
21
+ """
22
+ This module is responsible for the filling disparity algorithms:
23
+ thus it fills the disparity map with values estimated according to
24
+ their neighbourhood.
25
+ """
26
+
27
+ # Third party imports
28
+ import numpy as np
29
+ import xarray as xr
30
+
31
+ # Cars import
32
+ from cars.core import constants as cst
33
+
34
+
35
+ def add_empty_filling_band(
36
+ output_dataset: xr.Dataset,
37
+ filling_types: list,
38
+ ):
39
+ """
40
+ Add filling attribute to dataset or band to filling attribute
41
+ if it already exists
42
+
43
+ :param output_dataset: output dataset
44
+ :param filling: input mask of filled pixels
45
+ :param band_filling: type of filling (zero padding or plane)
46
+
47
+ """
48
+ nb_band = len(filling_types)
49
+ nb_row = len(output_dataset.coords[cst.ROW])
50
+ nb_col = len(output_dataset.coords[cst.COL])
51
+ filling = np.zeros((nb_band, nb_row, nb_col), dtype=bool)
52
+ filling = xr.Dataset(
53
+ data_vars={
54
+ cst.EPI_FILLING: ([cst.BAND_FILLING, cst.ROW, cst.COL], filling)
55
+ },
56
+ coords={
57
+ cst.BAND_FILLING: filling_types,
58
+ cst.ROW: output_dataset.coords[cst.ROW],
59
+ cst.COL: output_dataset.coords[cst.COL],
60
+ },
61
+ )
62
+ # Add band to EPI_FILLING attribute or create the attribute
63
+ return xr.merge([output_dataset, filling])
64
+
65
+
66
+ def update_filling(
67
+ output_dataset: xr.Dataset,
68
+ filling: np.ndarray = None,
69
+ filling_type: str = None,
70
+ ):
71
+ """
72
+ Update filling attribute of dataset with an additional mask
73
+
74
+ :param output_dataset: output dataset
75
+ :param filling: input mask of filled pixels
76
+ :param band_filling: type of filling (zero padding or plane)
77
+
78
+ """
79
+ # Select accurate band of output according to the type of filling
80
+ filling_type = {cst.BAND_FILLING: filling_type}
81
+ # Add True values from inputmask to output accurate band
82
+ filling = filling.astype(bool)
83
+ output_dataset[cst.EPI_FILLING].sel(**filling_type).values[filling] = True