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. 应用场景
- 目标检测与识别:通过轮廓提取图像中的特定对象。
- 形状分析:计算周长、面积等几何属性。
- 物体测量:用于测量物体的尺寸和外观特征。
相关文章:
OpenCV:图像轮廓
目录 简述 1. 什么是图像轮廓? 2. 查找图像轮廓 2.1 接口定义 2.2 参数说明 2.3 代码示例 2.4 运行结果 3. 绘制图像轮廓 3.1 接口定义 3.2 参数说明 3.3 代码示例 3.4 运行结果 4. 计算轮廓周长 5. 计算轮廓面积 6. 示例:计算图像轮廓的面…...
洛谷P11655「FAOI-R5」Lovely 139
P11655「FAOI-R5」Lovely 139 题目背景 Update:数据有 0 0,答案为 1,请选手特判以正常通过。 Height ≤ 139 \text{Height}\leq139 Height≤139。 题目描述 对于一个 01 \tt 01 01 串 S S S(下标从 1 1 1 开始)…...
文字显示省略号
多行文本溢出显示省略号...
Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget? 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…...
C++11 多线程 锁与条件变量:mutex、lock_guard、unique_lock 和 condition_variable
文章目录 mutex核心成员函数使用场景 lock_guard功能和特性构造函数使用场景 unique_lock功能和特性构造函数核心成员函数使用场景 lock_guard对比unique_lockcondition_variable核心成员函数使用场景 mutex std::mutex 是 C 标准库中提供的一种互斥量,用于在多线程…...
【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示
本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…...
Cosmos - 世界模型开发平台
文章目录 一、关于 Cosmos主要特点模型家族 二、使用示例1、推理2、后训练 许可证和联系方式 一、关于 Cosmos NVIDIA Cosmos是开发者第一的世界基础模型平台,旨在帮助物理AI开发者更好、更快地构建他们的物理AI系统。宇宙包含 预训练模型,可通过拥抱脸…...
图像分割中根据mask的ROI,去除mask和image中没有勾画ROI层数以外的图像
在分割任务中,一个患者有很多层图像,但是勾画的ROI仅有那么几层。我想去除ROI以外层数的那些没用的图像。这里以一个36张图像的nii格式数据为例 查看一下mask文件中有多少个非0图像 import nibabel as nib import numpy as np# 加载 .nii 文件 file_pat…...
【Java基础-42.3】Java 基本数据类型与字符串之间的转换:深入理解数据类型的转换方法
在 Java 开发中,基本数据类型与字符串之间的转换是非常常见的操作。无论是从用户输入中读取数据,还是将数据输出到日志或界面,都需要进行数据类型与字符串之间的转换。本文将深入探讨 Java 中基本数据类型与字符串之间的转换方法,…...
全栈开发:使用.NET Core WebAPI构建前后端分离的核心技巧(一)
目录 cors解决跨域 依赖注入使用 分层服务注册 缓存方法使用 内存缓存使用 缓存过期清理 缓存存在问题 分布式的缓存 cors解决跨域 前后端分离已经成为一种越来越流行的架构模式,由于跨域资源共享(cors)是浏览器的一种安全机制,它会阻止前端应用…...
springboot使用rabbitmq
使用springboot创建rabbitMQ的链接。 整个项目结构如下: 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…...
Linux——ext2文件系统(二)
Linux——ext2文件系统 ext2文件系统宏观认识一、磁盘分区与格式化二、块组(Block Group)结构三、文件系统特性 文件名与目录名与inode一、inode的作用原理二、文件与目录名与inode的关系 路径一,路径解析二,路径缓存三࿰…...
动手学深度学习-3.2 线性回归的从0开始
以下是代码的逐段解析及其实际作用: 1. 环境设置与库导入 %matplotlib inline import random import torch from d2l import torch as d2l作用: %matplotlib inline:在 Jupyter Notebook 中内嵌显示 matplotlib 图形。random:生成…...
“深度强化学习揭秘:掌握DQN与PPO算法的精髓“
深度Q网络(Deep Q-Network,简称DQN)是一种结合了Q学习和深度神经网络的强化学习算法。它使用神经网络来近似Q值函数,从而实现对复杂状态空间中的动作选择。DQN的核心思想是通过贝尔曼方程(Bellman Equation)…...
如何让DeepSeek恢复联网功能?解决(由于技术原因,联网搜索暂不可用)
DeekSeek提示:(由于技术原因,联网搜索暂不可用) 众所周知,因为海外黑客的ddos攻击、僵尸网络攻击,deepseek的联网功能一直处于宕机阶段,但是很多问题不联网出来的结果都还是2023年的,…...
Unity-编译构建Android的问题记录
文章目录 报错:AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout报错信息解读:原因分析最终处理方法 报错:AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout 报错信息解读࿱…...
python的ruff简单使用
Ruff 是一个用 Rust 编写的高性能 Python 静态分析工具和代码格式化工具。它旨在提供快速的代码检查和格式化功能,同时支持丰富的配置选项和与现有工具的兼容性。ruff是用rust实现的python Linter&Formatter。 安装: conda install -c conda-forge…...
Docker 部署 GLPI(IT 资产管理软件系统)
GLPI 简介 GLPI open source tool to manage Helpdesk and IT assets GLPI stands for Gestionnaire Libre de Parc Informatique(法语 资讯设备自由软件 的缩写) is a Free Asset and IT Management Software package, that provides ITIL Service De…...
【漫话机器学习系列】077.范数惩罚是如何起作用的(How Norm Penalties Work)
范数惩罚的作用与原理 范数惩罚(Norm Penalty) 是一种常用于机器学习模型中的正则化技术,它的主要目的是控制模型复杂度,防止过拟合。通过对模型的参数进行惩罚(即在损失函数中加入惩罚项),使得…...
【C++ STL】vector容器详解:从入门到精通
【C STL】vector容器详解:从入门到精通 摘要:本文深入讲解C STL中vector容器的使用方法,涵盖常用函数、代码示例及注意事项,助你快速掌握动态数组的核心操作! 一、vector概述 vector是C标准模板库(STL&am…...
LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略
LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 LLMs之OpenAI o系列:OpenAI o3-mini的简介、安…...
Notepad++消除生成bak文件
设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示...
后台管理系统通用页面抽离=>高阶组件+配置文件+hooks
目录结构 配置文件和通用页面组件 content.config.ts const contentConfig {pageName: "role",header: {title: "角色列表",btnText: "新建角色"},propsList: [{ type: "selection", label: "选择", width: "80px&q…...
Spring Boot项目如何使用MyBatis实现分页查询
写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...
[Java]多态
1. 多态的基本概念 1.1 定义: 多态是指同一操作作用于不同的对象时,能够表现出不同的行为。多态通常通过以下两种方式实现: 方法重载(Overloading)方法重写(Overriding) 1.2 示例࿱…...
用Impala对存储在HDFS中的大规模数据集进行快速、实时的交互式SQL查询的具体步骤和关键代码
AWS EMR(Elastic MapReduce)中应用Impala的典型案例,主要体现在大型企业和数据密集型组织如何利用Impala对存储在Hadoop分布式文件系统(HDFS)中的大规模数据集进行快速、实时的交互式SQL查询。以下是一个具体的案例说明…...
Intellij 插件开发-快速开始
目录 一、开发环境搭建以及创建action1. 安装 Plugin DevKit 插件2. 新建idea插件项目3. 创建 Action4. 向新的 Action 表单注册 Action5. Enabling Internal Mode 二、插件实战开发[不推荐]UI Designer 基础JBPanel类(JPanel面板)需求:插件设…...
GIt使用笔记大全
Git 使用笔记大全 1. 安装 Git 在终端或命令提示符中,输入以下命令检查是否已安装 Git: git --version如果未安装,可以从 Git 官方网站 下载并安装适合你操作系统的版本。 2. 配置 Git 首次使用 Git 时,需要配置用户名和邮箱…...
语言月赛 202412【题目名没活了】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202412] 题目名没活了 题目描述 在 XCPC 竞赛里,会有若干道题目,一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的,当且仅当: 在本次提交以前&…...
MySQL锁类型(详解)
锁的分类图,如下: 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前,它会…...
