海岸线识别与海面分割

📌 关键要点

海岸线、海面是"区域/线",不是"物体",YOLO 检测框(detect)并不适合直接识别,但通过"分割"思路可以完整解决。


一、为什么 YOLO 检测框不适合"海岸线"

YOLO detect 的天然假设是"目标能被一个矩形框框住"(人、车、船…),但:

场景对象 本质 YOLO 框检测是否合适
人落水、船只、游泳者 离散"物体" ✅ 合适(经典检测任务)
浪花飞溅、白沫区域 近似"物体" 🟡 可以(把浪当目标框)
海面、沙滩、天空 连续"区域" ❌ 不适合(框不住边界)
海岸线 一条"分界线" ❌ 极不适合(矩形框 vs 弯曲曲线)

结论:识别海岸线要用分割(像素级分类)思路——先把每个像素分成"天空/海/沙滩",两个区域的交界就是海岸线。


二、两条技术路线对比

路线 A:传统方法(OpenCV) 路线 B:深度学习分割(yolo-seg)
原理 颜色聚类 + 位置先验 神经网络逐像素分类
需要标注数据 不需要 需要(如 Roboflow 海面分割数据集)
需要训练 不需要 需要微调
速度 快(秒级) 快(CPU 几十 ms)
鲁棒性 差:阴天/光线变化/浪花易误判 强:学习到"海/沙/天"的真实特征
适合阶段 入门验证、快速原型 真实项目落地

本笔记先跑通路线 A(零数据即可演示),路线 B 在文末给出升级路径。


三、Demo 实现:KMeans 聚类分割

3.1 输入数据(无需自己标注)

用 AI 生成的一张典型海岸线图(蓝天 + 海洋 + 沙滩 + 地平线):

AI 生成的海岸线测试图

以后有真实海景图/摄像头画面,只需替换脚本里的 img_path 一行。

3.2 算法流程

像素 KMeans 聚类成 4 簇(按颜色自然分组)
        ↓
按垂直位置 + 颜色特征分配语义:
   位置最高的簇 → 天空    蓝色度最高(B-R)的簇 → 海    位置最低的簇 → 沙滩
        ↓
海像素最下沿连线 → 海岸线    海像素最上沿连线 → 天际线
        ↓
滑动平均 + 中值滤波平滑(抗海浪纹理造成的抖动)

核心代码(test\sea\coastline_demo.py):

# 1. KMeans 像素聚类
Z = img.reshape(-1, 3).astype(np.float32)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1.0)
_, labels, centers = cv2.kmeans(Z, 4, None, criteria, 5, cv2.KMEANS_PP_CENTERS)
label_img = labels.reshape(h, w)

# 2. 语义分配:按簇的平均 y 位置 + 蓝色度
sky_id  = min(clusters, key=lambda c: c['mean_y'])['id']       # 位置最高 = 天空
sand_id = max(clusters, key=lambda c: c['mean_y'])['id']       # 位置最低 = 沙滩
water_id = max(水候选簇, key=lambda c: c['blueness'])['id']    # 蓝色度最高 = 海

# 3. 逐列扫描海像素,取最上沿/最下沿构成线
for x in range(w):
    col = np.where(water_mask[:, x] > 0)[0]
    skyline.append(int(col.min()))   # 天际线
    coast.append(int(col.max()))     # 海岸线

3.3 运行

cd D:\BYP\Project\BYP\BYPsNotes\extern\attachments\topic\Yolo\test\sea
D:/B/software/anaconda/envs/CondaBYP/python.exe coastline_demo.py

输出三张图到 demo_out\:

文件 内容
1_original.jpg 原图
2_segmented.jpg 天空/海/沙滩 伪彩色分割图
3_result_lines.jpg 红线 = 海岸线,蓝线 = 天际线

四、结果解读

4.1 数值验证(1536×1024 输入)

验证项 实测值 判定
天空占比 50.9%(图上半部) ✅ 正确
海占比 14.8% ✅
沙滩占比 17.5% ✅
天际线 y 位置 569–573 px(约图高 56%) ✅ 海与天交界
海岸线 y 位置 689–1023 px(图下方) ✅ 海与沙滩交界
天际线在上、海岸线在下 True ✅ 几何合理

4.2 效果图

分割结果(天空蓝 / 海蓝 / 沙滩黄):

KMeans 分割结果:天空/海/沙滩

最终结果(红线海岸线 + 蓝线天际线):

海岸线(红线)与天际线(蓝线)提取结果


五、局限与升级路线

5.1 传统方法的局限

5.2 升级到深度学习分割(路线 B)

  1. 数据集:Roboflow Universe 搜索 sea segmentation / beach segmentation,导出 YOLO-seg 格式
  2. 训练:
yolo train data=my-sea.yaml model=yolov8n-seg.pt epochs=50 imgsz=640
  1. 海岸线提取:分割出海/沙两个类别掩码 → OpenCV 提取两区域交界轮廓,即海岸线

5.3 结合 seasentry 项目(海边监控)

需求 推荐方案
人落水、船只、游泳者 YOLO detect(框检测,最成熟)
大浪、浪花飞溅 YOLO detect 或分割
海面范围 / 海岸线变化 分割 + 边界提取(本文方案)
波浪运动方向/速度 视频帧差 + 光流

🔗 相关笔记:


📖 资料来源:


📝 创建时间:2026-08-31

相关笔记