From fbb068ec702338d609c1ca6eddbdb9f182d8f211 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Mon, 24 Aug 2026 11:37:16 +0800
Subject: [PATCH] feat: extend local GeoAI capability workflows
---
capabilities/00-change-detection/scan_change_detection_parameters.py | 16 ++++++++++++++--
1 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/capabilities/00-change-detection/scan_change_detection_parameters.py b/capabilities/00-change-detection/scan_change_detection_parameters.py
index 6b6084f..36d61e3 100644
--- a/capabilities/00-change-detection/scan_change_detection_parameters.py
+++ b/capabilities/00-change-detection/scan_change_detection_parameters.py
@@ -34,7 +34,7 @@
return cleaned, count - 1
-def preview(image: np.ndarray, mask: np.ndarray, max_dimension: int = 720) -> Image.Image:
+def preview(image: np.ndarray, mask: np.ndarray, generic_mask: np.ndarray | None = None, max_dimension: int = 720) -> Image.Image:
height, width = image.shape[:2]
scale = min(1.0, max_dimension / max(height, width))
size = (max(1, int(round(width * scale))), max(1, int(round(height * scale))))
@@ -42,6 +42,13 @@
small_mask = Image.fromarray((mask > 0).astype(np.uint8) * 255).resize(size, Image.Resampling.NEAREST)
base_array = np.asarray(base).copy()
mask_array = np.asarray(small_mask) > 0
+ if generic_mask is not None:
+ small_generic = Image.fromarray((generic_mask > 0).astype(np.uint8) * 255).resize(size, Image.Resampling.NEAREST)
+ generic_array = np.asarray(small_generic) > 0
+ cyan = np.zeros_like(base_array)
+ cyan[..., 1] = 220
+ cyan[..., 2] = 255
+ base_array[generic_array] = (base_array[generic_array].astype(np.float32) * 0.45 + cyan[generic_array].astype(np.float32) * 0.55).astype(np.uint8)
red = np.zeros_like(base_array)
red[..., 0] = 255
base_array[mask_array] = (base_array[mask_array].astype(np.float32) * 0.45 + red[mask_array].astype(np.float32) * 0.55).astype(np.uint8)
@@ -60,6 +67,11 @@
crs = probability_dataset.crs.to_string() if probability_dataset.crs else None
with rasterio.open(input_path) as input_dataset:
image = np.transpose(input_dataset.read([1, 2, 3]), (1, 2, 0))
+ generic_path = run_dir / "generic_difference_mask.tif"
+ generic_mask = None
+ if generic_path.is_file():
+ with rasterio.open(generic_path) as generic_dataset:
+ generic_mask = generic_dataset.read(1) > 0
output_dir.mkdir(parents=True, exist_ok=False)
rows: list[dict] = []
contact_items: list[tuple[str, Image.Image]] = []
@@ -78,7 +90,7 @@
# polygons are expensive and are not needed to compare thresholds.
features = demo._feature_summary(cleaned, probability, transform, crs is not None)
(item_dir / "regions.json").write_text(json.dumps({"features": features}, ensure_ascii=False, indent=2), encoding="utf-8")
- overlay = preview(image, cleaned)
+ overlay = preview(image, cleaned, generic_mask)
overlay.save(item_dir / "overlay_preview.jpg", quality=90)
row = {
"threshold": threshold,
--
Gitblit v1.9.3