OpenCV:图像轮廓

目录

简述

1. 什么是图像轮廓?

2. 查找图像轮廓

2.1 接口定义

2.2 参数说明

 2.3 代码示例

2.4 运行结果

3. 绘制图像轮廓

3.1 接口定义

3.2 参数说明

3.3 代码示例

 3.4 运行结果

4. 计算轮廓周长

5. 计算轮廓面积

6. 示例:计算图像轮廓的面积与周长

7. 应用场景


相关阅读

OpenCV:多边形逼近与凸包-CSDN博客


简述

在图像处理领域,轮廓是图像中物体的边界或形状信息的表达方式。通过提取轮廓,可以对图像中的目标进行识别、测量和分析。本文将从概念到实际操作详细介绍图像轮廓及其相关操作,并展示如何在 OpenCV 中实现。


1. 什么是图像轮廓?

图像轮廓 是图像中物体边界的闭合曲线,表示具有相同强度或颜色像素的连接路径。它是一种重要的图像特征,常用于形状分析和对象检测。

特点

  • 轮廓基于二值图像计算,必须先将输入图像转换为二值图。
  • OpenCV 提供的轮廓查找算法将视图像中的白色区域为前景(目标)。
  • 轮廓的方向可以是顺时针或逆时针。

2. 查找图像轮廓

OpenCV 提供了 cv2.findContours() 函数来查找图像的轮廓。

2.1 接口定义

contours, hierarchy = cv2.findContours(image, mode, method)

2.2 参数说明

image:输入的二值图像(通常是灰度图的阈值化结果)。
mode:轮廓的检索模式,常见值:

  • cv2.RETR_EXTERNAL:只检测最外层轮廓。
  • cv2.RETR_LIST:检测所有轮廓,不建立层级关系。
  • cv2.RETR_TREE:检测所有轮廓,并构建完整层级关系。

method:轮廓的近似方法:

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
  • cv2.CHAIN_APPROX_SIMPLE:只存储必要的轮廓点,压缩水平和垂直冗余点。

返回值:

  • contours:检测到的轮廓列表,每个轮廓是一个 Numpy 数组。
  • hierarchy:每个轮廓的层级关系。

 2.3 代码示例

import cv2# 读取图像并转为灰度图
image = cv2.imread('D:\\resource\\filter\\find_contours.png', cv2.IMREAD_GRAYSCALE)# 二值化
_, binary_img = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)# 轮廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)# 显示图像 
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 当前示例使用的图像为:白色背景,中间画了一个黑色的矩形。
  • 用win11自带的画图软件画出来的,并非纯粹的黑白图像,在代码中最好进行二值化处理
  • 该示例的作用是将图像中所有轮廓的必要点打印出来。

2.4 运行结果

 

打印结果显示的是:图像必要的轮廓点。

该图像包含2个轮廓 :

  • 最外层的白色背景边框。
  • 中间黑色矩形边框。

3. 绘制图像轮廓

OpenCV 提供了 cv2.drawContours() 函数用于绘制轮廓。

3.1 接口定义

cv2.drawContours(image, contours, contourIdx, color, thickness)

3.2 参数说明

image:目标图像,轮廓将绘制在此图像上。
contours:轮廓数据,cv2.findContours() 的输出。
contourIdx:指定绘制的轮廓索引:

  • -1:绘制所有轮廓。
  • >=0:绘制特定索引的轮廓。

color:绘制轮廓的颜色(BGR 格式)。
thickness:线条粗细,-1 表示填充轮廓。

3.3 代码示例

import cv2# 读取图像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 转为灰度图
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 轮廓查找
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 显示图像 
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 依旧使用同一张图片。
  • 该示例的作用是将图像中所有的轮廓用红色的线条绘制出来,其中线条的粗细数值为2。 

 3.4 运行结果

将图像中所有的轮廓绘制出来:


    4. 计算轮廓周长

    OpenCV 提供了 cv2.arcLength() 函数计算轮廓的周长。

    接口定义

    perimeter = cv2.arcLength(curve, closed)

    参数说明

    • curve:输入轮廓点。
    • closed:布尔值,是否将轮廓视为闭合曲线。

    返回值

    轮廓的周长(浮点数)。


    5. 计算轮廓面积

    OpenCV 提供了 cv2.contourArea() 函数计算轮廓的面积。

    接口定义:

    area = cv2.contourArea(contour)
    

    参数说明:

    • contour:输入轮廓点。

    返回值

    轮廓的面积(浮点数)。


    6. 示例:计算图像轮廓的面积与周长

    示例如下: 

    import cv2# 读取图像
    image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 转为灰度图
    gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
    _, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 轮廓查找
    #contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # print(contours)# 绘制轮廓
    #result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 计算面积
    area = cv2.contourArea(contours[1])
    print("area=%d"%(area))# 计算周长
    len = cv2.arcLength(contours[1], True)
    print("len=%d"%(len))# 显示图像 
    #cv2.imshow('image', image)
    #cv2.imshow('result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    示例说明:

    • 依旧使用同一张图像。
    • 查找图像轮廓,取索引为1的轮廓。
    • 计算其面积与周长,并打印出来。

     打印输出:

    PS D:\code\opencv_python> & "D:/Program Files/Python38-32/python.exe" d:/code/opencv_python/calc_contours.py
    area=35951
    len=769
    PS D:\code\opencv_python>

    7. 应用场景

    1. 目标检测与识别:通过轮廓提取图像中的特定对象。
    2. 形状分析:计算周长、面积等几何属性。
    3. 物体测量:用于测量物体的尺寸和外观特征。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11518.html

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    GMSL 明星产品之 MAX96724

    上一篇文章中,我们介绍了摄像头侧 GMSL 加串器 MAX96717. 今天我们来介绍下 GMSL 解串器明星产品 MAX96724: 可将四路 GMSL™2/1 输入转换为 1 路、2 路或 4 路 MIPI D-PHY 或 C-PHY 输出。该器件支持通过符合 GMSL 通道规范的 50Ω 同轴电缆或 100Ω 屏…

    城市道路车辆自行车摩托车公交车检测数据集VOC+YOLO格式5236张5类别

    数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5236 标注数量(xml文件个数):5236 标注数量(txt文件个数):5236 …

    VSCode插件Live Server

    简介:插件Live Server能够实现当我们在VSCode编辑器里修改 HTML、CSS 或者 JavaScript 文件时,它都能自动实时地刷新浏览器页面,让我们实时看到代码变化的效果。再也不用手动刷新浏览器了,节省了大量的开发过程耗时! 1…

    论文阅读(十):用可分解图模型模拟连锁不平衡

    1.论文链接:Modeling Linkage Disequilibrium with Decomposable Graphical Models 摘要: 本章介绍了使用可分解的图形模型(DGMs)表示遗传数据,或连锁不平衡(LD),各种下游应用程序之…

    穷举vs暴搜vs深搜vs回溯vs剪枝系列一>单词搜索

    题解如下 题目:解析决策树:代码设计: 代码: 题目: 解析 决策树: 代码设计: 代码: class Solution {private boolean[][] visit;//标记使用过的数据int m,n;//行,列char…

    智能小区物业管理系统打造高效智能社区服务新生态

    内容概要 随着城市化进程的不断加快,智能小区物业管理系统的出现,正逐步改变传统物业管理的模式,为社区带来了崭新的管理理念和服务方式。该系统不仅提升了物业管理效率,还加强了业主与物业之间的互动,为每位居民提供…

    高清种子资源获取指南 | ✈️@seedlinkbot

    在如今的数字时代,高清影视、音乐、游戏等资源的获取方式不断丰富。对于追求高质量资源的用户而言,一个高效的资源分享平台至关重要。而 ✈️seedlinkbot 正是这样一个便捷的资源获取工具,为用户提供高质量的种子资源索引和下载信息。 1. ✈️…

    3 [通用GITHUB投毒免杀工具安装木马攻击活动的详细分析]

    前言概述 通过github投毒的攻击事件之前发生过不少,笔者此前也分析过好几例,有些网友也给笔者发过一些相关的攻击样本,大家从网上下载的安全工具或免杀工具一定不要随便在自己机器上运行,很有可能这些工具就自带后门木马&#xf…

    沙皮狗为什么禁养?

    各位铲屎官们,今天咱们来聊聊一个比较敏感的话题:沙皮狗为什么会被禁养?很多人对沙皮狗情有独钟,但有些地方却明确禁止饲养这种犬种,这背后到底是什么原因呢?别急,今天就来给大家好好揭秘&#…

    LeetCode 404.左叶子之和

    题目描述 给定二叉树的根节点 root ,返回所有左叶子之和。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 示例 2: 输入: root [1] 输…

    一种非接触式智能垃圾桶设计(论文+源码+实物)

    1系统方案设计 通过对需求展开分析,本设计非接触式智能垃圾桶采用STM32F103单片机作为控制器,通过红外传感器实现垃圾桶的满溢检测,通过三个SG90舵机分别控制可回收、不可回收、其他垃圾桶盖的开关,并通过WiFi通信模块将数据信息传…

    vue入门到实战 三

    目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…

    Maven全解析:从基础到精通的实战指南

    概念: Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建,依赖管理和项目信息管理项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 依赖管理: 对第三方依赖包的管理&#xf…

    【背包问题】二维费用的背包问题

    目录 二维费用的背包问题详解 总结: 空间优化: 1. 状态定义 2. 状态转移方程 3. 初始化 4. 遍历顺序 5. 时间复杂度 例题 1,一和零 2,盈利计划 二维费用的背包问题详解 前面讲到的01背包中,对物品的限定条件…

    数据库 - Sqlserver - SQLEXPRESS、由Windows认证改为SQL Server Express认证进行连接 (sa登录)

    本文讲SqlServer Express版本在登录的时候, 如何由Windows认证,修改为Sql Server Express认证。 目录 1,SqlServer Express的Windows认证 2,修改为混合认证 3,启用sa 用户 4,用sa 用户登录 下面是详细…

    GWO优化LSBooST回归预测matlab

    灰狼优化算法(Grey Wolf Optimizer,简称 GWO),是一种群智能优化算法,由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出。该算法的设计灵感源自灰狼群体的捕食行为,核心思想是模仿灰狼社会的结构与行为…

    C++模板编程——可变参函数模板

    目录 1. 可变参函数模板基本介绍 2. 参数包展开——通过递归函数 3. 参数包展开——通过编译期间if语句(constexpr if) 4. 重载 5. 后记 进来看的小伙伴们应该对C中的模板有了一定了解,下面给大家介绍一下可变参函数模板。过于基础的概念将不仔细介绍。 1. 可变…

    海外问卷调查之渠道查,企业经营的指南针

    海外问卷调查,是企业调研最常用到的方法,有目的、有计划、有系统地收集研究对象的现实状况或历史状况的一种有效手段,是指导企业经营的有效手段。 海外问卷调查充分运用历史法、观察法等方法,同时使用谈话、问卷、个案研究、测试…

    【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.3 结构化索引:记录数组与字段访问

    2.3 结构化索引:记录数组与字段访问 目录/提纲 #mermaid-svg-gEcf7BuFng5Yj4mv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gEcf7BuFng5Yj4mv .error-icon{fill:#552222;}#mermaid-svg-gEcf7BuFng5Y…

    在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用

    上下拉电阻作用 在通用输入的时候,也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态,这样才能检测到不同电平状态。 如何保持电平状态? 1. 可以通过芯片内部的上下拉电阻,由于是弱上下拉一般不用 2. 硬件外界一个…