总结
本文介绍了如何使用 Maxar 开放数据计划提供的卫星图像,通过安装相关库、下载样本数据、制作互动地图、初始化 SAM(Segment Anything Model)、分割图像、显示分段输出、使用滑块比较图像以及在互动地图上显示图像等步骤,对利比亚洪灾的卫星图像进行分割处理。
摘要
文章首先介绍了 Maxar 开放数据计划,该计划提供了高分辨率的卫星图像,用于应急规划、风险评估、监测集结区、应急响应、损害评估和恢复工作。接着,文章详细说明了如何安装所需的图像处理库,包括 segment-geospatial
。然后,指导了读者如何下载利比亚德尔纳地区的样本卫星图像。
文章继续展示了如何利用 leafmap
库制作一个互动地图,并将下载的卫星图像添加到地图上。接下来,介绍了如何初始化 SAM 模型,并配置相关参数以优化遮罩生成的质量。文章还展示了如何使用 SAM 模型对图像进行分割,并将生成的掩膜从光栅转换为矢量格式。
在分割图像后,文章展示了如何显示分段输出,包括二值化图像和带有随机颜色的注释。此外,提供了一种使用滑块比较原始图像和分割后的图像的方法。最后,文章说明了如何将分割后的图像和注释添加到互动地图上,以便更直观地展示结果。
观点
- Maxar 开放数据计划是一个宝贵的资源,它为灾害响应和研究提供了高质量的卫星图像。
- 图像分割技术在灾害评估中扮演关键角色,能够帮助识别和量化受灾区域。
- SAM 模型的使用,通过调整参数和后处理步骤,可以提高对小型对象的识别能力,并优化分割结果的质量。
- 互动地图的应用,使得卫星图像的分析和展示更加直观和用户友好。
- 通过比较原始图像和分割后的图像,可以更清楚地理解分割模型的效果和准确性。
导入库
import os
import leafmap
from samgeo import SamGeo, raster_to_vector, overlay_images
下载样本数据
url = "https://github.com/opengeos/datasets/releases/download/raster/Derna_sample.tif"
leafmap.download_file(url, output="image.tif")
制作互动地图
m = leafmap.Map(height="600px")
m.add_basemap("SATELLITE")
m.add_raster("image.tif", layer_name="Image")
m.add_layer_manager()
m
初始化 SAM
自动生成遮罩包括多个可调参数,这些参数会影响点取样的密度以及丢弃低质量或重复遮罩的阈值。此外,该过程可在图像裁剪上自动运行,以提高对较小对象的处理性能,后处理可消除杂散像素并填充孔洞。下面是一个增加掩膜采样的配置示例:
sam_kwargs = {
"points_per_side": 32,
"pred_iou_thresh": 0.86,
"stability_score_thresh": 0.92,
"crop_n_layers": 1,
"crop_n_points_downscale_factor": 2,
"min_mask_region_area": 80,
}
sam = SamGeo(
model_type="vit_h",
sam_kwargs=sam_kwargs,
)
分割图像
sam.generate("image.tif", output="mask.tif", foreground=True)
# Convert raster to vector
raster_to_vector("mask.tif", output="mask.shp")
显示分段输出
# result as a binary image.
sam.show_masks(cmap="binary_r")
# Display the annotations (each mask with a random color).
sam.show_anns(axis="off", opacity=1, output="annotation.tif")
使用滑块比较图像
leafmap.image_comparison(
"image.tif",
"annotation.tif",
label1="Image",
label2="Segmentation",
)
# Overlay the annotations on the image and adjust the opacity interactively using the slider.
overlay_images("image.tif", "annotation.tif", backend="TkAgg")
在互动地图上显示图像
m.add_raster("mask.tif", layer_name="Mask", nodata=0)
m.add_raster("annotation.tif", layer_name="Annotation")
m
m.add_vector("mask.shp", layer_name="Vector", info_mode=None)