QGIS游泳池检测:5种方法对比

要在
里检测游泳池,先查 OpenStreetMap:Vector > QuickOSM > QuickOSM…,key 为 leisure,value 为 swimming_pool。地图稀疏的地方,在 raster 计算器里对蓝色做阈值,或跑分割模型。地面分辨率决定用哪一种。
网上说法错在哪里
论坛和教程里反复出现三个答案,每个都会浪费你一天。
“在 Sentinel-2 上跑 NDWI 数泳池。” Green 和 NIR 是 10 m,SWIR 是 20 m,而新建地下泳池只有 29 到 30 m²,也就是三分之一个像素。在居民区跑 MNDWI,只能找到城边的蓄水池,花园里的泳池一个也找不到。
“蓝色做阈值就是泳池。” 颜色规则只认颜色。蓝色金属屋顶、盖木柴堆的篷布会通过,深色池底泳池、发绿的泳池会被漏掉,加盖的泳池在影像里根本不存在。
“检测结果就是名单。” 法国税务局在 IGN 航片上跑过,仍然要给每个业主寄信。检测只是候选,把它与地块和姓名关联,就是个人数据。
简短答案
| 你的输入 | 方法 | 花费 |
|---|---|---|
| OSM 活跃测绘区 | Method 1,用 QuickOSM 查 leisure=swimming_pool | 免费,一次查询 |
| 5 到 30 cm 的 RGB 正射影像 | Method 2,在 raster 计算器里做颜色阈值 | 免费,QGIS 核心功能 |
| 带近红外或 SWIR 波段的影像 | Method 3,算水体指数再做阈值 | 免费,卫星上看不到花园泳池 |
| 多光谱影像和一个下午 | Method 4,SCP 或 dzetsaka | plugin 免费,花你的时间画训练区 |
| RGB 正射影像和几百个泳池 | Method 5,分割模型 | 免费 plugin 要你自备模型或 GPU。云端 plugin 有免费额度,之后订阅 |
我如何对比
五个标准:输入、影像是否离开本机、多少输出要手检、花费、安装成本。所有版本、价格和菜单路径都在 2026 年 9 月 3 日对照 QGIS 3.44 手册和各工具文档核对过。免费方法我在法国郊区正射影像和同一街区的 Sentinel-2 场景上跑过。
五种中我们做了一种,就是 Method 5。要大范围扫、还要有人为公开精度背书,用 Mapflow。它有专用的 Swimming pools 模型,按需提供,旁边标着 F1 高于 0.95。我们不对泳池公布数字。
开始之前
用投影 CRS 工作,下面三步要按 layer 单位做面积过滤。然后查分辨率。法国泳池联合会数据新建地下泳池 29 到 30 m²,在 10 cm 正射影像上是 3000 个像素,在 10 m Sentinel-2 波段上是三分之一个像素。
法国税务局在 IGN 航片上跑这个。Foncier innovant 试点对 9 个省 2022 年的 20,356 个泳池征税,价值 980 万欧元,2023 年全国一遍又找出 150,000 个应税未申报泳池。每一个最后都走了给业主寄信的流程。
Method 1:拿别人已经画好的泳池
OpenStreetMap 有 3,036,801 个 leisure=swimming_pool 对象,其中 2,731,704 个是有真实几何的 ways,taginfo 2026 年 9 月 3 日数据。
Open QuickOSM and query
Vector > QuickOSM > QuickOSM…,查询的是 Overpass API。Key 为 leisure,value 为 swimming_pool,范围用画布范围或指定行政区。
Keep polygons, filter to gardens
以 node 画的泳池没有面积,所以拿 polygon layer。1,808,809 个泳池还带 access=private,这就是后院泳池的过滤条件。
leisure=swimming_area 是另一种对象:在湖泊或海里指定的游泳区。

适用: 需要公共和商业泳池。
不用: 要找没人申报的。
Method 2:在 raster 计算器里对蓝色做阈值
这是核心 QGIS 能做到的最近方案。打开 Raster > Raster Calculator…,波段写法是 layer_name@band_number。在 RGB 正射影像上,这条规则保留明亮的高饱和蓝色:
("ortho@3" > 90) AND ("ortho@3" - "ortho@1" > 25) AND ("ortho@3" - "ortho@2" > 10)
数字是我在 20 cm 正射影像上调的。采样 20 个泳池像素和 20 个屋顶像素,再移动阈值。
用 Raster > Conversion > Polygonize (Raster to Vector) 转面,再用 native:extractbyexpression 过滤:按面积用 $area > 6 AND $area < 400,按形状用我自己的比值 4 * pi() * $area / ($perimeter ^ 2) > 0.5,因为 QGIS 没有内置紧凑度函数。

RGB 值随太阳角度和曝光漂移,在一条航带上调好的阈值,到下一条就坏了。色调和饱和度更稳,走 Processing Toolbox 的 i.rgb.his,它“transforms raster maps from RGB (Red-Green-Blue) color space to HIS (Hue-Intensity-Saturation) color space”。
两种规则都不知道蓝色东西是什么。
- 阴影。 背阴屋顶坡面呈深蓝色。提高下限,树下泳池就丢了。
- 蓝色屋顶和篷布。 又亮又蓝,形状还经常刚好。
- 深色池底和发绿泳池。 黑色池衬像沥青,藻绿像草坪。我的规则两个都漏了。
- 加盖泳池。 影像里根本不存在。

适用: 一张一致的正射影像,愿意手检。
不用: 多架次拼接的镶嵌图。
Method 3:在有波段的影像上算水体指数
水几乎完全吸收近红外,所以在 NIR 里呈黑色,而蓝色屋顶依然很亮。
- NDWI,McFeeters 1996:
(Green - NIR) / (Green + NIR)。在 Sentinel-2 上为(B3 - B8) / (B3 + B8)。 - MNDWI,Xu 2006:
(Green - SWIR) / (Green + SWIR)。在 Sentinel-2 上为(B3 - B11) / (B3 + B11)。用 SWIR 代替 NIR 能压住建成区,在郊区这点很关键。
大于零做阈值,转面,按 Method 2 过滤。Rodríguez-Cuenca 和 Alonso 在 2014 年为这个任务调过 Normalized Difference Swimming Pools Index。
Sentinel-2 的 B3 和 B8 是 10 m,B11 是 20 m,所以 30 m² 泳池永远无法从花园里分离出来。在居民区跑 MNDWI,只能得到城边的蓄水池,别的什么也没有。

适用: 正射影像有 50 cm 或更细的 NIR 波段。完胜颜色。
不用: 只有三波段 RGB,或想在 Sentinel-2 上找花园泳池。
Method 4:在自己的影像上训练分类器
分类器从你画的样本里学泳池像素,所以能扛住搞坏固定阈值的镶嵌图。
Semi-Automatic Classification Plugin by Luca Congedo 是常用选择。在 SCP dock 里建训练输入(.scpx),画 ROI,再在主窗口跑 SCP > Band processing > Classification。六种算法,从 Minimum Distance 到 Random Forest。9.0.4 版 2026 年 7 月 11 日发布,但声明 QGIS 最低 3.99,所以 QGIS 3.x 还是装 8.5.0。
dzetsaka 5.0.11,by Nicolas Karasiak,更轻:十一种分类器,它的 Gaussian Mixture Model 不用 scikit-learn 也能跑。
蓝色屋顶类和阴影类也要画。分类器只会拒绝你给它看过的东西。

适用: 多架次多季节,流程要重复用。
不用: 一张正射影像跑一遍。两个都是分像素不分对象,转面和过滤省不掉。
Method 5:分割模型
分割模型读形状和上下文,同样的蓝色能分出泳池和篷布。我们做的就是这类,AI Segmentation。这一节讲我们自己的工具。
Install and sign in
plugin 管理器,QGIS 3.22 或更高。不用 GPU,不用模型权重。要一个账号,有免费额度,之后 39 欧元/月,不含税。
Draw a zone, type the word, filter
输入 swimming pool 并运行。多边形回到项目 CRS,自带面积、周长和置信度。排序,删掉错的。
两个数字来自我们的调参表,运行时读取。泳池任务要求约 0.13 m 每像素,分块最大 300 m,粗了泳池就糊进露台。swimming pool 的复核从 0.20 置信度打开,building 是 0.30,因为泳池 mask 分数本来就比屋顶低。

一个限制:加盖泳池到不了模型,所以会漏检。两种云模式都会把影像发到我们在欧盟的服务器。

另外四个能干这活的,2026 年 9 月 3 日读取。
| 工具 | 安装什么 | GPU | 账号 | 影像离开本机 | 泳池支持 | 花费 |
|---|---|---|---|---|---|---|
| Deepness | plugin 管理器、Python 依赖、ONNX 模型 | 可选,CPU 可跑 | 否 | 否 | 取决于你提供的模型 | 免费 |
| Geo-SAM | plugin 管理器、依赖、模型权重 | 可选 | 否 | 否 | 每次点击或拉框出一个对象 | 免费 |
| samgeo | 一个 Python 包,没有 QGIS 面板 | 推荐 | 否 | 否 | 可写脚本,没有泳池类 | 免费 |
| Mapflow | plugin 管理器 | 不用 | 是 | 是 | 专用的 Swimming pools 模型,按需提供 | 积分,付费 |
| AI Segmentation(我们的) | plugin 管理器 | 不用 | 是 | 两种云模式是,本地模型否 | 输入 swimming pool | 免费额度,之后 39 欧元/月,不含税 |
适用: 泳池多到不想手画。
不用: 影像不能离开本机。用 Deepness 或 Geo-SAM。
五种方法对照
| 你有什么 | 方法 |
|---|---|
| 测绘完善的城镇,公共泳池够用 | Method 1,QuickOSM |
| 一张好于 30 cm 的 RGB 正射影像 | Method 2,颜色阈值再过滤 |
| 带 NIR 波段的正射影像 | Method 3,NDWI |
| Sentinel-2 或任何 10 m 影像 | 花园泳池哪个都不行。去找更细的影像 |
| 多架次、可重复的流程 | Method 4,SCP 或 dzetsaka |
| 几百个泳池,不想忍误检 | Method 5,分割模型 |
记住什么
先看分辨率,再看波段,再看你能承受多少手检。
30 m² 泳池在 10 m 上永远无法从花园里分离,所以不管跑什么指数,Sentinel-2 都不是找后院泳池的传感器。
颜色阈值会返回街区里所有蓝色东西,所以先按面积和紧凑度过滤,再看结果。
加盖泳池在影像里缺失,所以这页没有方法能找到,多少钱都不行。
检测是候选。不管跑什么,在有人对该 layer 采取行动之前,先打开置信度最低的十个多边形。
Try it free in QGIS, no card needed
常见问题
QGIS 能自己检测游泳池吗?
不能,作为功能没有。核心 QGIS 给你 raster 计算器、面矢量化和矢量过滤,也就是 Method 2。把泳池识别为对象需要一个 plugin。
能在 Sentinel-2 影像里找后院泳池吗?
不能。Green 和 NIR 是 10 m 波段,SWIR 是 20 m,30 m² 泳池只占三分之一个像素。用 30 cm 或更细的航片。
蓝色屋顶为什么总被认成泳池?
彩钢屋顶比池水更亮更蓝,而颜色规则只认颜色。按面积和紧凑度过滤,转用 NDWI,或用模型。
用航片检测游泳池合法吗?
把检测与地块和业主姓名关联就是个人数据,在 EU 需要 GDPR 下的合法依据。税务局有写进法律的依据。私营公司通常没有,所以关联前问你的数据保护官,模型的输出永远不能是账单前的最后一步。
精度能期待多高?
一个数字就是假的,随影像和季节变。20 cm 上的开放泳池回来得很好,加盖泳池这里全漏,蓝色屋顶就是你要手删的东西。
过滤步骤全文,看在 QGIS 中检测建筑轮廓。mask 背后的清理,看在 QGIS 中 raster 转矢量。其余在 QGIS AI hub。


