Opencv 学习笔记:腐蚀操作 + 轮廓标记 + 分水岭分割

📅 发布时间:2026/7/11 11:43:34 👁️ 浏览次数:
Opencv 学习笔记:腐蚀操作 + 轮廓标记 + 分水岭分割
腐蚀是形态学操作的核心常与轮廓分析、分水岭算法结合实现图像分割。本文整合「腐蚀去噪→轮廓标记→分水岭分割」全流程演示从预处理到最终分割的完整逻辑新手可直接复用。核心代码实现import cv2 as cv import numpy as np # 1. 读取图像并初始化补充完整流程 src cv.imread(./image/test.bmp) # 替换为你的图像路径 if src is None: print(图像读取失败请检查路径) exit() srcss src.copy() # 分水岭分割画布 result4 src.copy() # 腐蚀输入图像需为单通道二值图此处补充预处理 # 预处理转为灰度图→二值化腐蚀操作的前提 gray cv.cvtColor(result4, cv.COLOR_BGR2GRAY) ret, result4 cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 2. 腐蚀操作核心去除小噪点强化前景轮廓 # 创建结构化元素9×9矩形核尺寸越大腐蚀越强 kernel cv.getStructuringElement(cv.MORPH_RECT, (9, 9)) result5 cv.erode(result4, kernel) # 执行腐蚀 # 3. 轮廓检测基于腐蚀后的图像 result6 np.uint8(result5) # 确保为uint8格式轮廓检测要求 contours, hierarchy cv.findContours(result6, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE) # 4. 轮廓标记为分水岭算法生成标记图 # 初始化标记图float32类型尺寸与原图一致 result7 np.zeros((src.shape[0], src.shape[1]), np.float32) # 遍历轮廓为每个轮廓分配唯一标记值从5开始避免与背景冲突 for i, contour in enumerate(contours): cv.drawContours(result7, contours, i, i5, 1) # 标记值i5线宽1 # 5. 执行分水岭分割 cv.watershed(srcss, result7) # 标注分割边界标记值为-1的区域是分割线 srcss[result7 -1] [0, 0, 255] # 分割线标红 # 6. 显示结果 cv.namedWindow(腐蚀结果, cv.WINDOW_NORMAL) cv.resizeWindow(腐蚀结果, 600, 600) cv.imshow(腐蚀结果, result5) cv.namedWindow(轮廓标记图, cv.WINDOW_NORMAL) cv.resizeWindow(轮廓标记图, 600, 600) cv.imshow(轮廓标记图, result7 / result7.max() * 255) # 归一化显示 cv.namedWindow(分水岭分割结果, cv.WINDOW_NORMAL) cv.resizeWindow(分水岭分割结果, 600, 600) cv.imshow(分水岭分割结果, srcss) cv.waitKeyEx(0) cv.destroyAllWindows()关键知识点解析1. 核心流程拆解步骤核心 API作用说明腐蚀操作cv.erode()用 9×9 矩形核腐蚀图像消除小噪点让前景轮廓更清晰轮廓检测cv.findContours()提取腐蚀后图像的轮廓为分水岭提供前景标记轮廓标记cv.drawContours()为每个轮廓分配唯一数值标记i5生成分水岭标记图分水岭分割cv.watershed()基于标记图分割图像result7 -1为分割边界2. 核心参数与避坑点腐蚀核参数cv.getStructuringElement(cv.MORPH_RECT, (9,9))矩形核尺寸越大腐蚀效果越强需根据图像噪点大小调整小噪点用 3×3大噪点用 9×9轮廓标记值标记值从 5 开始而非 0/1避免与分水岭算法的「背景0」「未知区域1」冲突是分割成功的关键数据类型要求轮廓检测输入必须为uint8类型因此需result6 np.uint8(result5)分水岭标记图必须为float32类型因此初始化result7时指定np.float32分割边界标注watershed执行后标记图中值为-1的像素是分割边界用红色标注可直观验证分割效果。3. 形态学操作扩展操作API作用膨胀cv.dilate()与腐蚀相反扩大前景区域修复轮廓断裂开运算cv.morphologyEx(src, cv.MORPH_OPEN, kernel)先腐蚀后膨胀去除小噪点且不改变前景大小闭运算cv.morphologyEx(src, cv.MORPH_CLOSE, kernel)先膨胀后腐蚀填充前景孔洞总结腐蚀操作是分水岭分割的关键预处理核心作用是去除小噪点、强化前景轮廓核尺寸需适配噪点大小分水岭算法的核心是「标记图」轮廓标记值需避开 0/1避免与背景 / 未知区域冲突数据类型严格匹配轮廓检测→uint8分水岭标记图→float32是流程运行的基础。