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

腐蚀是形态学操作的核心,常与轮廓分析、分水岭算法结合实现图像分割。本文整合「腐蚀去噪→轮廓标记→分水岭分割」全流程,演示从预处理到最终分割的完整逻辑,新手可直接复用。

核心代码实现

python 复制代码
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, i+5, 1)  # 标记值=i+5,线宽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() 为每个轮廓分配唯一数值标记(i+5),生成分水岭标记图
分水岭分割 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) 先膨胀后腐蚀,填充前景孔洞

总结

  1. 腐蚀操作是分水岭分割的关键预处理,核心作用是去除小噪点、强化前景轮廓,核尺寸需适配噪点大小;
  2. 分水岭算法的核心是「标记图」:轮廓标记值需避开 0/1,避免与背景 / 未知区域冲突;
  3. 数据类型严格匹配(轮廓检测→uint8,分水岭标记图→float32)是流程运行的基础。
相关推荐
智者知已应修善业13 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
小弥儿14 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
知识分享小能手16 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
He BianGu16 小时前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
m4Rk_16 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github
小李不想当小白16 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
hhzz17 小时前
【OpenCV 入门到精通 10】视频分析与光流跟踪:背景减除与运动检测
人工智能·python·opencv·性能优化
2601_9499506318 小时前
练题簿在线练题全流程:从资料导入到模拟考试与错题复盘
学习·考研·小程序·刷题·小程序推荐
2601_9653842618 小时前
口腔黏膜清洁的工程化路径:从表面形貌表征到清洁策略匹配
经验分享·笔记
泡泡鱼(敲代码中)18 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm