Opencv 学习笔记:轮廓发现(提取 + 绘制全流程)

轮廓发现是图像目标分割、形状分析的核心技术,本文通过 "高斯滤波→二值化→轮廓提取→轮廓绘制" 的完整流程,演示 OpenCV 中轮廓的查找与可视化,新手可直接复用。

核心代码实现

python 复制代码
import cv2 as cv
import numpy as np

# 1. 读取图像并校验
src = cv.imread('.\image\39.bmp')
if src is None:
    print('图像读取失败,请检查路径!')
    exit()

# 2. 预处理:高斯滤波去噪(避免噪点干扰轮廓提取)
dst = cv.GaussianBlur(src, (3, 3), 15)
# 转灰度图
gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
# 二值化(分离前景与背景)
ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_BINARY)

# 3. 查找轮廓(核心操作)
# 参数说明:二值图、轮廓检索模式、轮廓逼近方法
contours, hierarchy = cv.findContours(
    binary, 
    cv.RETR_TREE,       # 检索所有轮廓并建立层级关系
    cv.CHAIN_APPROX_SIMPLE  # 压缩轮廓点(仅保留拐点,节省内存)
)

# 4. 绘制所有轮廓(在滤波后的图像上标注)
draw_img = dst.copy()  # 复制图像,避免修改原图
for i, contour in enumerate(contours):
    # 参数:绘图图像、轮廓列表、轮廓索引(-1绘制所有)、颜色、线宽
    cv.drawContours(draw_img, contours, i, (255, 0, 0), 5)

# 5. 显示结果
cv.namedWindow('src', cv.WINDOW_NORMAL)
cv.resizeWindow('src', 600, 600)
cv.imshow('src', src)          # 原图
cv.imshow('binary', binary)    # 二值化图
cv.namedWindow('result', cv.WINDOW_NORMAL)
cv.resizeWindow('result', 600, 600)
cv.imshow('result', draw_img) # 轮廓绘制结果

cv.waitKeyEx(0)
cv.destroyAllWindows()

关键知识点解析

1. 轮廓发现核心流程

步骤 核心 API 作用说明
高斯滤波 cv.GaussianBlur() 去除图像噪点,避免噪点被识别为伪轮廓
二值化 cv.threshold() 将图像转为黑白,让轮廓特征更明显
查找轮廓 cv.findContours() 提取图像中所有轮廓的坐标点
绘制轮廓 cv.drawContours() 将轮廓可视化标注在图像上

2. 核心参数说明

  • findContours 参数
    • cv.RETR_TREE:检索所有轮廓并保留层级关系(如轮廓嵌套),常用还有cv.RETR_EXTERNAL(仅检索最外层轮廓);
    • cv.CHAIN_APPROX_SIMPLE:压缩轮廓点(如矩形仅保留 4 个角点),比cv.CHAIN_APPROX_NONE(保留所有点)更节省内存。
  • drawContours 参数
    • 轮廓索引i:指定绘制第 i 个轮廓,传入-1可一次性绘制所有轮廓;
    • 线宽5:轮廓线条粗细,值为-1时会填充轮廓内部。

3. 避坑与优化技巧

  • 绘图载体 :原代码直接在滤波图dst上绘图,改为draw_img = dst.copy(),避免修改原始滤波图像;

  • 二值化阈值:阈值 100 需根据图像调整,暗目标可降低阈值(如 80),亮背景可提高阈值(如 120);

  • 轮廓筛选 :可通过轮廓面积过滤小噪点轮廓:

    python 复制代码
    # 仅保留面积≥500的轮廓
    valid_contours = [cnt for cnt in contours if cv.contourArea(cnt) >= 500]
  • 轮廓逼近 :对不规则轮廓,可使用cv.approxPolyDP()拟合为规则形状(如多边形、圆形)。

总结

  1. 轮廓发现的核心预处理是高斯滤波 + 二值化,去噪是提升轮廓提取准确率的关键;
  2. findContoursRETR_TREE适合复杂轮廓(嵌套),RETR_EXTERNAL适合仅需外层轮廓的场景;
  3. 绘制轮廓时建议复制图像作为绘图载体,避免修改原始图像。
相关推荐
xuhaoyu_cpp_java23 分钟前
项目学习(三)分页查询
java·经验分享·笔记·学习
小宋加油啊2 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
Xzh04233 小时前
AI Agent 学习路线(Java 后端方向)
java·人工智能·学习
Cloud_Shy6183 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 33 - 35)
开发语言·人工智能·笔记·python·学习方法
做cv的小昊4 小时前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
星恒随风4 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
gis分享者5 小时前
OpenCV 新手入门与实战部署指南
人工智能·opencv·计算机视觉
sensen_kiss5 小时前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.8 软件测试 (Software Testing)(上)
学习·软件工程
力学与人工智能5 小时前
PPT分享 | 洛桑联邦理工学院魏震:深度几何学习在工业设计优化中的应用
学习·优化·工业设计·深度几何学习·洛桑联邦理工学院
sensen_kiss7 小时前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.9 软件测试 (Software Testing)(下)
学习·软件工程