【Python】【OpenCV】凸轮廓和Douglas-Peucker算法
针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作。
cv2.arcLength() Method:
参数:
curve:要计算周长的轮廓,可以是一个矩形、圆形、多边形等封闭曲线。closed:一个布尔值,表示轮廓是否为封闭曲线。如果closed=True,则假设轮廓是闭合的;如果closed=False,则假设轮廓是开放的。
返回值:
retval:给定轮廓的周长或长度。如果轮廓是一个封闭曲线(如圆形、多边形等),则retval表示该曲线的周长;如果轮廓是一条开放曲线(如一条直线),则retval表示该曲线的长度。
cv2.approxPolyDP() Method:
参数:
curve:要逼近的输入轮廓。epsilon:指定逼近精度的参数,即逼近多边形与原始曲线之间的最大距离。这个参数决定了逼近的精度,值越小表示逼近得越精确。通常情况下,这个值是一个很小的正数。closed:一个布尔值,表示逼近多边形是否是封闭的。如果closed=True,则表示输出的逼近多边形是封闭的,即首尾相连形成一个闭合多边形;如果closed=False,则表示输出的逼近多边形是开放的。
返回值:
approxCurve:表示逼近后的多边形曲线。这是一个新的轮廓,它是对输入轮廓进行多边形逼近后得到的结果。
1 import cv2
2 import numpy
3
4 img = cv2.imread('../img/img.png', -1)
5 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
6 contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
7
8 img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
9 for c in contours:
10 # 计算轮廓的总长的百分之一,作为最大差值
11 epsilon = 0.01 * cv2.arcLength(c, True)
12 # 将轮廓近似为一个多边形
13 approx = cv2.approxPolyDP(c, epsilon, True)
14 # 获取轮廓的凸多边形,并且可以完全包含整个轮廓
15 hull = cv2.convexHull(c)
16
17 # cv2.drawContours(img, [c], -1, (0, 255, 0), 2)
18 cv2.drawContours(img, [approx], -1, (255, 255, 0), 2)
19 cv2.drawContours(img, [hull], -1, (0, 0, 255), 2)
20
21
22 # img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
23 # img = cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
24 cv2.imshow('', img)
25 cv2.waitKey()
26 cv2.destroyAllWindows()
上述代码中,可以修改 epsilon(ε)参数来获得不同逼近的多边形,当 epsilon(ε)越大,则得到的多边形越简易,越小则越贴近传入的轮廓形状。
运行结果:

【Python】【OpenCV】凸轮廓和Douglas-Peucker算法的更多相关文章
- 【python+opencv】轮廓发现
python+opencv---轮廓发现 轮廓发现---是基于图像边缘提取的基础寻找对象轮廓的方法, 所有边缘提取的阈值选定会影响最终轮廓发现的结果. 介绍两种API使用: -cv.findConto ...
- Douglas Peucker算法的C#实现
一.算法原理 Douglas-Peucker算法 在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度 上保持原有的形状. 经典的Douglas-Peucke ...
- Python+OpenCV图像处理(十六)—— 轮廓发现
简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 代码如下: import cv2 as cv import numpy as np def c ...
- 【python+opencv】直线检测+圆检测
Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...
- python+opencv实现车牌定位
写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三. 由于时间紧张,代码没有进行任何优化, ...
- Python+opencv 图像拼接
1.http://www.cnblogs.com/skyfsm/p/7411961.html ,给出了很好地拼接算法实现 2.由于不是Python的,所以简单做了一些翻译转成Python+opencv ...
- linux/ubuntu下最简单好用的python opencv安装教程 ( 解决 imshow, SIFT, SURF, CSRT使用问题)
希望这篇文章能彻底帮你解决python opencv安装和使用中的常见问题. 懒人请直奔这一节, 一条命令安装 opencv 使用python-opencv常用的问题 在linux中使用python版 ...
- 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化
一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...
- python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)
概述 车牌识别是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常来讲如果结合opencv进行车牌识别主要分为四个大步骤,分别为: 图像采集 车牌定位 分割车牌字符 字符识别 当然,如果结合了机器 ...
- 搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台
搭建基于python +opencv+Beautifulsoup+Neurolab机器学习平台 By 子敬叔叔 最近在学习麦好的<机器学习实践指南案例应用解析第二版>,在安装学习环境的时候 ...
随机推荐
- TiDB的简单介绍以及进行资源限制的方式与方法
TiDB的简单介绍以及进行资源限制的方式与方法 TiDB的简介 TiDB是一个分布式数据库, 简介为: TiDB 是一个开源的分布式关系型数据库,它兼具了分布式数据库的水平扩展性和传统关系型数据库的 ...
- JAVA实现单链表修改和删除数据节点
JAVA实现单链表修改和删除数据节点 一.修改单链表中的一个节点 ①实现思路 因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表.所以我们需要先找一个辅助 ...
- Python基础——字符编码、文件处理
文章目录 字符编码 一 引入 二 知识储备 2.1 三大核心硬件 2.2 文本编辑器读取文件内容的流程 2.3 python解释器执行文件的流程 2.4 总结 三.字符编码介绍 3.1 什么是字符编码 ...
- Spring扩展接口(2):BeanDefinitionRegistryPostProcessor
在此系列文章中,我总结了Spring几乎所有的扩展接口,以及各个扩展点的使用场景.并整理出一个bean在spring中从被加载到最终初始化的所有可扩展点的顺序调用图.这样,我们也可以看到bean是如何 ...
- PolarD&N2023秋季个人挑战—Crypto全解
EasyRSA (额..这个题看错了不是挑战赛的.这里当做好题记录下来了) 题目信息:500 分 5 Polar币 from Crypto.Util.number import bytes_to_lo ...
- dfs 序 O(nlogn)-O(1) 求 LCA
学点分树,发现不会询问复杂度 \(O(1)\) 的 LCA.于是被迫递归式学习. 我们设 \(dfn_i\) 表示点 \(i\) 在 dfs 过程中第几个被访问到,把点按访问到的顺序排序得到的序列叫 ...
- 停止 Windows 11 更新的行之有效的办法,去掉 Windows Defender 实时监控(Win 11)
用设置的方法,几乎无法达成目的.即使禁用 Windows 11 服务里的 "Windows 更新" 服务,系统也会自己将之改成手动,然后再打开. 先找到控制面板 -> 服务, ...
- lora训练之偷师
自stable diffusion开源之后AIGC绘画方向定制化百花齐放百家争鸣.而c站 https://civitai.com/ 也聚集了全球爱好者的各种微调训练模型分享. 其中以lora为首,应用 ...
- 最佳实践-使用Github Actions来构建跨平台容器镜像
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 前言 最近在写K8s的相关系列文章,因为有涉及到镜像构建,发现在Mac m1的Arm架构下构建的部分镜像,没法在X86架构 ...
- bool数据类型用法
1 来自百度 1.bool为布尔型用作逻辑判断 2 2.bool只有一个字节 3 3.bool取值false和true,0为false,非0为true.(例如-1和2都是true). 4 4.bool ...