当前位置: 首页 > news >正文

分水岭算法:图像分割的浸水原理

分水岭算法:基于拓扑地貌的边界提取

核心原理
分水岭算法将图像视为拓扑地貌,灰度值代表海拔高度。通过模拟浸水过程:

  1. 局部极小值:对应集水盆(区域内部)。
  2. 分水岭线:集水盆之间的山脊(区域边界)。
  3. 淹没过程:从最低点开始注水,水位上升时在不同集水盆汇合处构建堤坝(分水岭)。

关键步骤

  1. 预处理
    • 梯度计算:使用Sobel、Canny等算子提取边缘(如 gradient = cv2.Laplacian(image, cv2.CV_64F))。
    • 降噪:高斯模糊或形态学开运算去除微小噪声。
  2. 标记控制
    • 前景标记:通过阈值分割或距离变换提取确定区域(如 cv2.distanceTransform)。
    • 背景标记:膨胀操作扩展背景区域。
  3. 分水岭变换:使用 cv2.watershed 函数,标记区域边界为 -1
import cv2  # OpenCV库,用于图像处理
import numpy as np  # NumPy库,用于数值计算def watershed_segmentation(image):"""使用分水岭算法对输入图像进行分割,并标记边界:param image: 输入的BGR彩色图像:return: 标记了分水岭边界的图像(边界显示为红色)"""# 1. 转换为灰度图像# 分水岭通常基于灰度图像的梯度计算,因此先将彩色图像转为灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 2. 阈值分割(二值化)# 使用Otsu算法自动确定阈值,并反转二值图像(背景为白色,前景为黑色)# cv2.THRESH_BINARY_INV:反转二值化,使前景为白色(255),背景为黑色(0)ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 3. 形态学开运算(去噪)# 定义3x3的全1结构元素(核)kernel = np.ones((3, 3), np.uint8)# 开运算 = 先腐蚀后膨胀,用于去除小的噪声点(如孤立白点)opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)# 4. 确定背景区域# 对开运算结果进行膨胀操作,扩展背景区域,确保背景完全覆盖噪声sure_bg = cv2.dilate(opening, kernel, iterations=3)# 5. 距离变换(提取确定的前景)# 计算每个前景像素到最近背景像素的距离(欧式距离,L2范数)dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)# 对距离变换结果进行阈值化,提取确定的前景区域(距离较大的像素)ret, sure_fg = cv2.threshold(dist_transform, 0.5 * dist_transform.max(), 255, 0)# 将结果转换为8位无符号整数(0-255)sure_fg = np.uint8(sure_fg)# 6. 确定未知区域(边界区域)# 未知区域 = 背景区域 - 确定的前景区域unknown = cv2.subtract(sure_bg, sure_fg)# 7. 标记连通区域# 对确定的前景区域进行连通组件标记(每个连通区域分配一个唯一标签)ret, markers = cv2.connectedComponents(sure_fg)# 分水岭算法要求标记从1开始(0表示未知区域),因此对所有标记+1markers = markers + 1# 将未知区域(unknown)的标记设为0markers[unknown == 255] = 0# 8. 应用分水岭算法# 输入原始图像和标记矩阵,分水岭算法会修改标记矩阵# 边界区域的标记会被设为-1markers = cv2.watershed(image, markers)# 9. 标记边界(可视化)# 将分水岭边界(markers == -1)在原图上标记为蓝色image[markers == -1] = [255, 0, 0]  # BGR格式的蓝色return image# 主程序
if __name__ == "__main__":# 读取输入图像(确保路径正确)image = cv2.imread('input.jpg')# 调用分水岭分割函数result = watershed_segmentation(image)# 保存结果图像cv2.imwrite('output.jpg', result)

 分水岭算法主要是用于标记前景和背景的分界线,最终的处理结果如下:

http://www.lryc.cn/news/582431.html

相关文章:

  • 【王树森推荐系统】召回12:曝光过滤 Bloom Filter
  • 大数据在UI前端的应用创新:基于社交网络的用户影响力分析
  • 深度学习——神经网络1
  • 基于物联网的智能交通灯控制系统设计
  • three案例 Three.js波纹效果演示
  • 【操作系统】进程(二)内存管理、通信
  • MySQL Galera Cluster部署
  • 如何利用AI大模型对已有创意进行评估,打造杀手级的广告创意
  • 算法学习笔记:11.冒泡排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 【计算机网络】王道考研笔记整理(1)计算机网络体系结构
  • 高效学习之一篇搞定分布式管理系统Git !
  • 【字节跳动】数据挖掘面试题0013:怎么做男女二分类问题, 从抖音 app 提供的内容中。
  • 视频号账号矩阵运营中定制开发开源 AI 智能名片 S2B2C 商城小程序的赋能研究
  • main(int argc,char **agrv)的含义
  • 第0章:开篇词 - 嘿,别怕,AI应用开发没那么神!
  • Nat.C|RiNALMo:通用 RNA 语言模型新突破,3600 万序列预训练,跨家族结构预测、剪接识别与功能注释全能泛化
  • 【Note】《Kafka: The Definitive Guide》 第8章: Cross-Cluster Data Mirroring
  • 安卓10.0系统修改定制化____如何修改ROM 实现开机自动开启开发者选项与隐藏开发者选项
  • 【Python进阶篇 面向对象程序设计(3) 继承】
  • 龙旗科技社招校招入职测评25年北森笔试测评题库答题攻略
  • 创意Python爱心代码
  • 软件架构升级中的“隐形地雷”:版本选型与依赖链风险
  • stm32--SPI原理应用W25Q64(二)
  • python中MongoDB操作实践:查询文档、批量插入文档、更新文档、删除文档
  • 基于Java+SpringBoot的在线小说阅读平台
  • 网络安全之注入攻击:原理、危害与防御之道
  • 【C语言】const、volatile、restrict、static四大关键字学习笔记
  • javaScirpt学习第八章-第一部分
  • RoboRefer:面向机器人视觉-语言模型推理的空间参考
  • 针对Exhcnage Server的攻击防范措施