day17 - 用形状包围图像

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

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

完成本期内容,你可以:

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

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

  • 操作系统: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来选取合适的近似多边形,方便后续的图像处理操作。

点击下载源码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法基础学习笔记——⑨C++STL使用技巧

✨博主:命运之光 ✨专栏:算法基础学习 目录 ✨CSTL简介 ✨CSTL使用技巧 前言:算法学习笔记记录日常分享,需要的看哈O(∩_∩)O,感谢大家的支持! ✨CSTL简介 vector变长数组,倍增的思想//系统为…

STM32单片机(三)第一节:GPIO输出

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

驱动开发:内核读写内存浮点数

如前所述,在前几章内容中笔者简单介绍了内存读写的基本实现方式,这其中包括了CR3切换读写,MDL映射读写,内存拷贝读写,本章将在如前所述的读写函数进一步封装,并以此来实现驱动读写内存浮点数的目的。内存浮…

MyBatis操作数据库表和动态SQL的使用

目录 1.MyBatis开发环境的搭建和测试 2.MyBatis基本操作 2.0 准备工作 2.1 新增操作 2.2 删除、修改、查询操作 2.3 #{param} 和 ${param}的使用和区别 2.4 实体对象属性和数据库字段名称不同时如何映射? 3. MyBatis多表查询 3.0 准备工作 3.1 一对一的表…

ELK企业级日志分析系统

ELK概述 为什么要使用 ELK 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。 往…

切比雪夫不等式,大数定律及极限定理。

一.切比雪夫不等式 1.定理 若随机变量X的期望EX和方差DX存在,则对任意ε > 0,有   P{ |X - EX| > ε } < DX/ε2 或 P{ |X - EX| < ε } > 1 - DX/ε2 2.解析定理 ①该定理对 X 服从什么分布不做要求&#xff0c;仅EX DX存在即可。 ②“| |” 由于X某次…

软件测试炸了,作为从业者,你做好准备了吗?

软件测试行业已经发生很大变化&#xff0c;你跟上变化了吗&#xff1f; 岗位少不可怕&#xff0c;要求越来越高也不可怕&#xff0c;可怕的是&#xff0c;软件测试行业已经发生巨变&#xff0c;而你却原地踏步&#xff01;目前一线大厂更多倾向于招收测试开发&#xff0c;或者…

自学网络安全(黑客),一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且…

torch.distributed.launch多卡多机

torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.distributed.launch 可以通过命令&#xff0c;来打印该模块提供的可选参数 python -m torch.distributed.launch --help usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]…

诚迈科技携智达诚远出席高通汽车技术与合作峰会

5月25日至26日&#xff0c;诚迈科技及旗下的智能汽车操作系统及中间件产品提供商智达诚远作为高通生态伙伴&#xff0c;亮相首届“高通汽车技术与合作峰会”&#xff0c;通过产品展示和主题演讲呈现了基于高通骁龙数字底盘的最新智能座舱技术成果&#xff0c;共同展望智能网联汽…

GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack

GrapeCity Documents for Excel (GcExcel) v6.1 版本现已上线&#xff01;该版本支持新的 SpreadJS .sjs 文件格式和 Excel 模板文件 .xltx 格式。此外&#xff0c;GcExcel 支持更多的SpreadJS兼容性功能和对 GcDataViewer 的多项增强。看看下面的主要亮点。 导入/导出 Spread…

Revit幕墙:用幕墙巧做屋面瓦及如何快速幕墙?

一、Revit中用幕墙巧做屋面瓦 屋面瓦重复性很高&#xff0c;我们如何快速的创建呢?下面我们来学会快速用幕墙来创建屋面瓦的技巧。 1.新建“公制轮廓-竖挺”族&#xff0c;以此来创建瓦的族(以便于载入项目中使用) 2.在轮廓族中绘制瓦的轮廓(轮廓需要闭合)&#xff0c;将族名称…

【JavaSE】Java基础语法(三十四):实现多线程

文章目录 1. 简单了解多线程2. 并发和并行3. 进程和线程4. 实现多线程方式一&#xff1a;继承Thread类【应用】5. 实现多线程方式二&#xff1a;实现Runnable接口【应用】6. 实现多线程方式三: 实现Callable接口【应用】7. 设置和获取线程名称【应用】8. 线程休眠【应用】9. 线…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

xlsx是什么格式

xlsx是什么格式? xlsx是Excel文档的扩展名&#xff0c;其基于Office Open XML标准的压缩文件格式&#xff0c;取代了其以前专有的默认文件格式&#xff0c;在传统的文件名扩展名后面添加了字母x&#xff0c;即.xlsx取代.xls。 xlsx文件是什么格式? xlsx是Excel表格的文件格…

【P34】JMeter ForEach控制器(ForEach Controller)

文章目录 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明二、准备工作三、测试计划设计 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明 可以对一个组变量进行循环迭代&#xff1b;该组件通常与后置处理器中的 JSON 提取器、正…

桥梁结构健康监测解决方案

城市桥梁担负着城市的交通和运输网络的重要角色&#xff0c;是城市生命线的重要组成部分。然而&#xff0c;随着时间的推移和日益增长的负荷&#xff0c;桥梁可能会受到各种因素的损害&#xff0c;如自然灾害、疲劳、腐蚀等。因此&#xff0c;桥梁结构健康监测变得至关重要&…

chatgpt赋能Python-python中怎么导入numpy

介绍 Python是一种广泛使用的编程语言&#xff0c;具有许多内建功能和模块&#xff0c;让开发者能够快速地编写代码。然而&#xff0c;虽然能够实现许多计算&#xff0c;但是原始Python本身并不足够处理各种科学和数字计算上需要的高效性&#xff0c;因此numpy这个开源的Pytho…

【机器学习】采样方法

文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…

JavaWeb ( 十 ) SpringMVC

4.Spring MVC Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。 三层架构分为表述层&#xff08;或表示层)、业务逻辑层、数据访问层&#xff0c;表述层表示前台页面和后台servlet 4.1.Spring MVC优点&#xff1a; ① 基于原生的Servlet&#xff0c;通过…