分水岭算法

发布时间:2026/8/20 16:17:15
分水岭算法 分水岭算法分水岭算法是一种基于形态学的图像分割技术通过模拟水流在图像梯度地形中的扩展来划分区域。分水岭变换原理任何灰度图像均可视为地形地貌。分水岭机制若从局部极小值注水并阻断异源水流的汇合图像即被分割为两类区域集水盆地与分水岭界线。梯度图应用将此变换作用于图像梯度后集水盆地理论上应映射图像中的同质灰度区域。从上到下从左到右以此为原始图像、梯度图像、梯度图像分水岭、最终轮廓算子名称watershedswatersheds—— 从图像中提取分水岭与盆地区域算子签名watersheds(Image : Basins, Watersheds : : )功能描述将图像灰度拓扑结构视为山脉进行分割高灰度值→ 对应山脉峰顶亮区域低灰度值→ 对应山谷盆地暗区域 输出结果包含两个部分Basins盆地暗色连通区域每个盆地作为独立区域输出区域数组Watersheds分水岭亮色单像素宽边界线包围所有盆地单个区域参数说明参数名类型方向描述Image单通道图像输入支持类型字节型byte、16位无符号uint2、浮点型realBasins区域数组输出分割后的盆地区域集合每个元素为独立连通域Watersheds区域输出分水岭线区域宽度≤1像素关键技术点预处理要求必须对输入图像进行平滑滤波以减少过分割gauss_filter(Image, Smoothed, 5) // 推荐高斯滤波边缘保护 // 或 binomial_filter(Image, Smoothed, 9, 9) // 快速近似滤波实时应用若需动态合并相邻盆地改用watersheds_threshold并设置合并阈值过分割控制噪声影响噪声或纹理细节会产生伪盆地优化策略增大滤波器尺寸牺牲细节后处理合并小区域merge_regions或select_shape应用场景与代码示例显微图像中分离重叠细胞挑战传统阈值法无法区分粘连目标优势分水岭利用几何拓扑实现物理分割代码流程read_image (Image, cells) *-- 预处理高斯滤波抑制噪声并平滑边缘 --* gauss_filter (Image, Smoothed, 7) *-- 分水岭分割 --* watersheds (Smoothed, Basins, Watersheds) *-- 后处理筛选有效细胞区域面积100像素--* select_shape (Basins, ValidCells, area, and, 100, 99999)工程实践建议滤波器选择高斯滤波优先用于保留边缘细节均值滤波适用于均匀背景mean_image处理速度更快参数调优高斯核尺寸 目标最小直径 / 3如细胞直径30像素 → 核尺寸10合并阈值watersheds_threshold设为背景噪声幅度的2倍硬件加速启用HALCON的GPU加速需set_system(use_gpu, true)对4K图像GPU加速可提升3-5倍性能算子名称 watersheds_thresholdwatersheds_threshold—— 基于阈值合并分水岭盆地的图像分割算子签名watersheds_threshold(Image : Basins : Threshold : )功能原理通过分水岭高度阈值动态合并相邻盆地解决传统分水岭算法的过分割问题第一步执行标准分水岭分割等同于watersheds算子第二步若相邻盆地间分水岭的最小灰度差≤Threshold则合并这两个盆地 max(W - B_1,W - B_2 ) Threshold参数说明参数名类型方向描述工程建议值Image单通道图像输入支持类型byte/uint2/real需预处理平滑滤波高斯滤波后图像Basins区域数组输出合并后的盆地区域集合-Threshold数值输入分水岭合并阈值≥0控制合并强度5~30见下表参数调优步骤初始测试设置Threshold0观察原始分水岭结果渐进调整以5为步长递增直到相邻目标合并验证标准合并后区域不丢失真实缺陷与watersheds的对比特性watershedswatersheds_threshold输出盆地分水岭线仅合并后的盆地过分割控制无动态阈值合并适用场景高对比度清晰目标复杂纹理/低对比度目标计算耗时较低1x基准较高约1.3x基准因合并计算工程注意事项预处理必要性必须使用gauss_filter或binomial_filter平滑图像否则阈值合并失效滤波核尺寸公式核半径 TargetMinDistance / 3目标最小间距/3阈值边界条件Threshold0等效于watersheds但仅返回盆地分水岭线被合并ThresholdMaxGray全图合并为单一区域用于背景提取后处理建议*-- 剔除边缘粘连区域距图像边界10像素--* select_shape (MergedBasins, ValidRegions, row, and, 10, Height-10) select_shape (ValidRegions, FinalRegions, column, and, 10, Width-10)