day17 - 用形状包围图像

news2024/11/23 6:56:57

在进行图像轮廓提取时,有的情况下不需要我们提取出精确的轮廓,只要提取出一个接近于轮廓的近似多边形,就可以满足后续的操作。

本期我们来学习如何通过设置参数来找出图像的近似多边形。

完成本期内容,你可以:

  • 了解图像轮廓的基本特性
  • 学会提取图像的轮廓近似多边形

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


绘制多边形轮廓

OpenCV中提供了cv2.approxPolyDP()函数来绘制多边形轮廓。

函数原型:approxCurve = cv2.approxPolyDP( curve, epsilon, closed )

approxCurve为逼近多边形点集;

参数描述如下:

  • curve:是轮廓。
  • epsilon:精度,原始轮廓的边界点与逼近多边形边界之间的最大距离。
  • closed:逻辑值。该值为真时,逼近多边形是封闭的;否则,逼近曲线是不封闭的。

计算轮廓面积

OpenCV中提供了cv2.contourArea()函数可以用来计算轮廓面积。

函数原型:cv2. contourArea(contour, oriented=None):

参数描述如下:

  • contour:输入的点,一般是图像的轮廓点;
  • oriented: 表示某一个方向上轮廓的的面积值,顺时针或者逆时针,一般选择默认false。

计算轮廓周长

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

函数原型:cv2. arcLength(curve, closed)

参数描述如下:

  • curve :输入的点,一般是图像的轮廓点;
  • closed :用来指定对象的形状是闭合的(True),还是打开的一条曲线(False)。

轮廓拟合

边界函数

  • 贴合轮廓(近似多边形):cv2.approxPolyDP()

  • 包含轮廓点集中的最小矩形:cv2.boundingRect()

  • 表示计算二维点集形成封闭、倾斜及最小面积的矩形:cv2. minAreaRect()

  • 完全包围已有轮廓的最小圆:cv2.minEnclosingCircle()

  • 椭圆拟合cv2. fitEllipse()

  • 直线拟合cv2.fitLine()等

OpenCV中提供了cv2.approxPolyDP () 函数来绘制多边形轮廓。

函数原型: approxCurve = cv2.approxPolyDP( curve, epsilon, closed )

参数说明:

  • approxCurve:逼近多边形点集;

  • curve:是轮廓;

  • epsilon:精度,原始轮廓的边界点与逼近多边形边界之间的最大距离;

  • closed:逻辑值。该值为真时,逼近多边形是封闭的;否则,逼近曲线是不封闭的。


具体步骤

使用图像轮廓技术获取图像轮廓的近似多边形。

请添加图片描述

步骤一:创建项目工具

创建项目名为使用多边形近似图像轮廓,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

使用多边形近似图像轮廓                     # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

步骤二:获取轮廓并绘制

  1. 导入所需模块:OpenCV;
  2. 读取dataset文件夹下的clouds.png 图片;
  3. 将原图像复制,用于绘制图像轮廓;
  4. 将图像转换为二值图像;
  5. 获取图像轮廓并绘制;

代码实现

# 导入OpenCV
import cv2

#读取并显示原始图像
o = cv2.imread('../dataset/clouds.png')
cv2.imshow("original",o)

#获取轮廓
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
_,contours, hierarchy = cv2.findContours(binary,
                                          cv2.RETR_LIST,
                                          cv2.CHAIN_APPROX_SIMPLE)
#直接绘制边缘
adp = o.copy()
adp=cv2.drawContours(adp,contours,-1,(0,0,255),2)
cv2.imshow("result",adp)

请添加图片描述

处理效果

步骤三:绘制精度为0.1倍周长的近似多边形轮廓

  1. 复制图像;
  2. 设置原始轮廓的边界点与逼近多边形边界之间的最大距离为轮廓的0.1 倍;
  3. 绘制多边形;
  4. 在图像上绘制轮廓,颜色为红色,线宽为2并展示;

代码实现

#epsilon=0.1*周长
adp = o.copy()# 复制图像
#原始轮廓的边界点与逼近多边形边界之间的最大距离为轮廓的0.1 倍
epsilon = 0.1*cv2.arcLength(contours[0],True) 
#绘制多边形
approx = cv2.approxPolyDP(contours[0],epsilon,True) 
# 在图像上绘制轮廓,颜色为红色,线宽为2
adp=cv2.drawContours(adp,[approx],0,(0,0,255),2)
cv2.imshow("result0.1",adp)

请添加图片描述

处理效果

步骤四:绘制精度为0.05倍周长的近似多边形轮廓

  1. 复制图像;
  2. 设置原始轮廓的边界点与逼近多边形边界之间的最大距离为轮廓的0.05倍;
  3. 绘制多边形;
  4. 在图像上绘制轮廓,颜色为红色,线宽为2并展示;

代码实现

#epsilon=0.05*周长
adp = o.copy()
epsilon = 0.05*cv2.arcLength(contours[0],True)
approx = cv2.approxPolyDP(contours[0],epsilon,True)
adp=cv2.drawContours(adp,[approx],0,(0,0,255),2)
cv2.imshow("result0.05",adp)

请添加图片描述

处理效果

步骤五:绘制精度为0.02倍周长的近似多边形轮廓

  1. 复制图像;
  2. 设置原始轮廓的边界点与逼近多边形边界之间的最大距离为轮廓的0.02倍;
  3. 绘制多边形;
  4. 在图像上绘制轮廓,颜色为红色,线宽为2并展示;
  5. 等待释放窗口。

代码实现

#epsilon=0.02*周长
adp = o.copy()
epsilon = 0.02*cv2.arcLength(contours[0],True)
approx = cv2.approxPolyDP(contours[0],epsilon,True)
adp=cv2.drawContours(adp,[approx],0,(0,0,255),2)
cv2.imshow("result0.02",adp)
#等待释放窗口
cv2.waitKey()
cv2.destroyAllWindows()

请添加图片描述

处理效果

使用近似多边形的方法cv2.approxPolyDP()来获得图像的近似轮廓的过程中,可以通过控制参数epsilon来选取合适的近似多边形,方便后续的图像处理操作。

点击下载源码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《汇编语言》- 读书笔记 - 第5章- [BX]和 loop 指令

《汇编语言》- 读书笔记 - 第5章- [BX]和 loop 指令 5.1 [BX]问题 5.1 5.2 Loop 指令任务 1任务 2任务 3程序 5.1问题 5.2问题 5.2 5.3 在 Debug 中跟踪用 loop 指令实现的循环程序5.4 Debug 和汇编编译器 masm 对指令的不同处理DebugMASM 5.5 loop 和[bx]的联合应用程序 5.5问…

大数据项目实战之数据仓库:电商数据仓库系统——第9章 数仓开发之DWD层

文章目录 第9章 数仓开发之DWD层9.1 交易域加购事务事实表9.2 交易域下单事务事实表9.3 交易域取消订单事务事实表9.4 交易域支付成功事务事实表9.5 交易域退单事务事实表9.6 交易域退款成功事务事实表9.7 交易域购物车周期快照事实表9.8 工具域优惠券领取事务事实表9.9 工具域…

Python论文复现:VMD之自适应选择分解模态数K值

Python论文复现:《基于稀疏指标的优化变分模态分解方法》 信号分解方法中,虽然变分模态分解(Variational Mode Decomposition, VMD)有严格的数学推导,能有效抑制端点效应、模态混叠等问题,但其分解模态数需…

Docker笔记9 | Docker中网络功能知识梳理和了解

9 | Docker中网络功能知识梳理和了解 1 外部访问容器1.1 访问方式1.2 映射所有接口地址1.3 映射到指定地址的指定端口1.4 映射到指定地址的任意端口1.5 查看映射端口配置 2 容器互联2.1 新建网络2.2 连接容器 3 配置DNS 简单说:Docker 允许通过外部访问容器或容器互…

Python中的全局变量与局部变量

1 定义 全局变量指的是在整个python文件中定义的变量,而局部变量是在函数内部定义的变量。 a 1 def yang_func():b 2 从以上代码中可以看出,变量a是全局变量,变量b是定义在yang_func()函数的内部,因此b是局部变量。 2 使用范…

云原生之部署Docker管理面板SimpleDocker

云原生之部署Docker管理面板SimpleDocker 一、SimpleDocker介绍1. SimpleDocker简介2. SimpleDocker特点 二、本地环境介绍1. 本地环境规划2. 本次实践介绍 三、本地环境检查1.检查Docker服务状态2. 检查Docker版本3.检查docker compose 版本 四、下载SimpleDocker镜像五、部署…

【GD32开发】一、GD32F103 TIMER0 PWM死区时间计算

一、PWM死区时间如何计算? GD32F103的数据手册关于死区时间控制的公式如上图。 DTCFG的值为 设置死区结构体的寄存器值 tDTS_CK的值为 系统时钟的时钟周期。 如:GD32F103的系统时钟是108Mhz, 则tDTS_CK 1/108Mhz 9.26ns。( stm32的这个值跟定时器的…

如何从 Android 内部存储中恢复已删除的照片?

我们使用手机录制的照片和视频通常存储在手机的内存中。我们存储它们以记住我们生活的美丽。然而,在管理这些照片的过程中,一些用户却发现自己不小心删除了这些照片,这很尴尬。 如果您的 Android 设备遇到过此类问题,那么您来对地…

SpringBoot日记本系统小白部署指南

哈喽,大家好,我是兔哥。 之前写的SpringBoot日记本系统备受好评,考虑到还是有很多小伙伴不会部署,所以这一篇文章就单独来讲一下部署步骤吧。 需要资源 idea(破不破解都行) MySQL(最好5.7以…

redis高级篇一

redis 是多线程还是单线程 redis单线程的操作 主要是指redis的网路IO和键值对的读写是由一个线程来完成的,Redis在处理客户端的请求时,包括获取(socket 读),解析,执行,内容返回(so…

linux(动静态库)

目录: 1.文件时间的概念 2.动态库和静态库 3.如何制作动静态库 -------------------------------------------------------------------------------------------------------------------------------- 1.文件时间的概念 我们现在就开始学习这三个时间分别表示了什…

AI百科:一个开启人工智能时代的综合性平台

无论是人工智能的快速发展还是AI技术在各个领域的广泛应用,都让我们对智能未来充满了期待和好奇。随着科技的进步,发现了一个好网站,一个集合了丰富AI工具和产品介绍的综合性网站—— AI百科。 在人工智能(AI)领域的快…

【实用工具 - vscode】实现Linux服务器的远程操控

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【计算机工具】 ✒️✒️本篇内容:vscode的下载安装,常见插件及详细安装方法,插件停用及卸载,vscode快捷键 …

如何将文件制作成二维码

日常生活和工作中,为了让大家更方便的查阅文件,可将文件生成二维码,打印在通知书、会议要求,或是直接用“二维码”分享。通过草料二维码可以将多种类型的文件快速生成文件二维码,微信扫码查看即可查看和下载文件。 ● …

项目风险管理的四个阶段,你了解多少?

项目风险管理是项目管理的一部分,目的是保证项目总目标的实现。 风险管理包括风险识别、风险估计、风险解决和风险监控。风险管理贯穿在项目中的每个环节,在项目的生命周期中监控风险是非常重要的手段。 风险管理包含四个阶段: 1、风险识别…

从需求分析到功能扩展:打破瓶颈,构建智能采购管理软件

在当今快速发展的商业环境下,采购管理已成为企业发展的关键环节之一。如何在采购管理中快速响应市场需求、协调供应链、提高效率和降低成本,是摆在企业面前的一个巨大挑战。因此,打破瓶颈,构建智能采购管理软件成为了迫切的需求。…

内蒙古自治区住房和城乡建设分析及解决方案

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划(2021—2035年)的通知》(国办发 ﹝2020﹞39号)、《国家发展改革委等部门关于进一步提升…

一文读懂如何将 Rancher 下游集群升级到 Kubernetes v1.25

介 绍 最初在 Kubernetes v1.21 中被弃用的 PodSecurityPolicy API,已经在 Kubernetes v1.25 中被完全删除。由于 API 被移除,你无法在 Kubernetes v1.25 集群中创建、编辑或查询 PodSecurityPolicy 资源。此外,由于其准入控制器已被移除&am…

JAVA-类隔离机制

一、类加载: 1、类加载:Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码加载到内存,发给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的…

Windows 上安装和启动 Nacos 2.2.2 最新版本

文章目录 前言版本声明本地启动1. 下载 Nacos2. 开启鉴权配置3. 持久化数据库4. 启动 Nacos5. 启动测试 联系我 前言 本文旨在为您详细介绍如何安装和启动 Nacos 2.2.2 的最新版本,以及为 youlai-mall 开源商城版本的升级做好准备工作。 版本声明 名称版本操作系…