Skip to content

Commit 367f5e1

Browse files
Use opencv rasterizer instead of rasterio in S1.transform()
1 parent b0a4de5 commit 367f5e1

1 file changed

Lines changed: 13 additions & 16 deletions

File tree

insardev_pygmtsar/insardev_pygmtsar/utils_satellite.py

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3235,22 +3235,19 @@ def compute_transform_inverse(prm, dem,
32353235
margin = 10 * max(dx, dy)
32363236
polygon = polygon.buffer(margin)
32373237

3238-
# Rasterize polygon to valid mask
3239-
from rasterio.features import rasterize
3240-
from rasterio.transform import from_bounds
3241-
3242-
# Create affine transform for output grid
3243-
transform = from_bounds(out_x[0] - dx/2, out_y[-1] - dy/2,
3244-
out_x[-1] + dx/2, out_y[0] + dy/2, n_x, n_y)
3245-
3246-
# Rasterize polygon
3247-
valid_mask = rasterize(
3248-
[(polygon, 1)],
3249-
out_shape=(n_y, n_x),
3250-
transform=transform,
3251-
fill=0,
3252-
dtype=np.uint8
3253-
).astype(bool)
3238+
# Fast path: if polygon covers entire grid, all pixels are valid (skip cv2 import)
3239+
grid_box = shapely.box(out_x[0], out_y[0], out_x[-1], out_y[-1])
3240+
if polygon.contains(grid_box):
3241+
valid_mask = np.ones((n_y, n_x), dtype=bool)
3242+
else:
3243+
# Rasterize polygon to valid mask (cv2, no rasterio/GDAL to avoid fork deadlocks)
3244+
import cv2
3245+
poly_coords = np.array(polygon.exterior.coords)
3246+
px = ((poly_coords[:, 0] - out_x[0]) / (out_x[-1] - out_x[0]) * (n_x - 1)).astype(np.int32)
3247+
py = ((poly_coords[:, 1] - out_y[0]) / (out_y[-1] - out_y[0]) * (n_y - 1)).astype(np.int32)
3248+
valid_mask = np.zeros((n_y, n_x), dtype=np.uint8)
3249+
cv2.fillPoly(valid_mask, [np.column_stack([px, py])], 1)
3250+
valid_mask = valid_mask.astype(bool)
32543251

32553252
n_valid = valid_mask.sum()
32563253

0 commit comments

Comments
 (0)