首页 > 编程语言 >【Python】【OpenCV】凸轮廓和Douglas-Peucker算法

【Python】【OpenCV】凸轮廓和Douglas-Peucker算法

时间:2023-12-06 21:44:55浏览次数:46  
标签:多边形 Peucker img 逼近 Python cv2 Douglas closed 轮廓

针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作。

 

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(ε)越大,则得到的多边形越简易,越小则越贴近传入的轮廓形状。

 

运行结果:

 

标签:多边形,Peucker,img,逼近,Python,cv2,Douglas,closed,轮廓
From: https://www.cnblogs.com/vangoghpeng/p/17880586.html

相关文章

  • python中级之异常处理
    什么是异常##异常是程序运行时可能发生的错误或意外情况##本篇博客主要写的是异常相关知识,在Python代码的编写过程中经常会出现异常,一般情况下程序员都叫做出BUG了,这个BUG就是臭虫的意思,表示程序出臭虫了。当然很多时候我们也戏称“无BUG,不编程”。异常的分类-内......
  • python异常处理
    【一】什么是异常异常是程序运行时可能发生的错误或意外情况。在Python中,异常是一种对象,表示程序执行期间发生的错误。当出现异常时,程序的正常流程会被中断,而是跳转到异常处理流程。【1】BaseException(所有异常的基类)SystemExit:解释器请求退出KeyboardInterrupt:用户中......
  • python中级之深浅拷贝
    深浅拷贝异同相同点:无论深拷贝还是浅拷贝都会创建一个新对象。即:拷贝出来的对象的id不同。不同点:浅拷贝:只拷贝了对象,对象内的元素并不会发生拷贝。深拷贝:不仅拷贝对象,对象内的元素也会发生拷贝。浅拷贝浅拷贝举例来看一个浅拷贝的例子:importcopya=[1,2,[3,4]]......
  • 大白话说Python+Flask入门(六)Flask SQLAlchemy操作mysql数据库
    写在前面这篇文章被搁置真的太久了,不知不觉拖到了周三了,当然,也算跟falsk系列说再见的时候,真没什么好神秘的,就是个数据库操作,就大家都知道的CRUD吧。FlaskSQLAlchemy的使用1、FlaskSQLAlchemy简介FlaskSQLAlchemy是基于Flaskweb框架和SQLAlchemyORM(对象关系映射)的工具......
  • 【python基础之数据类型的内置方法】--- 数据类型的内置方法
    title:【python基础之数据类型的内置方法】---数据类型的内置方法date:2023-12-0120:54:06updated:2023-12-0620:30:00description:【python基础之数据类型的内置方法】---数据类型的内置方法cover:https://home.cnblogs.com/u/dream-ze/【一】八大基......
  • python利用依赖注入实现模块解耦
    python不是编译型语言,比较容易出现循环依赖的情况,比如模块A依赖模块B,而模块B反过来依赖模块A.当然可以通过重构解决此问题,比如合并此两个模块.但是还有一些技术可以帮助实现解耦.比如之前我写过的基于消息的机制,把模块间的依赖转换为对消息的依赖.本文章介绍另外一......
  • python assert用法
    python中assert用法。具体分析如下1、assert语句用来声明某个条件是真的。2、如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。3、当assert语句失败的时候,会引发一AssertionEr......
  • buuctf 加固题 babypython WriteUp
    原题wp参考链接:https://www.cnblogs.com/karsa/p/13529769.html这是CISCN2021总决赛的题,解题思路是软链接zip读取文件,然后伪造admin的session读取flag回到buuctf的这个题:ssh连上去,查看文件/app/y0u_found_it/y0u_found_it_main.py关键代码:random.seed(uuid.getnode())a......
  • Python中级之深浅拷贝
    深浅拷贝Python源码对深浅拷贝的解释以下来源于Python源码中对copy的解释#英文原文Thedifferencebetweenshallowanddeepcopyingisonlyrelevantforcompoundobjects(objectsthatcontainotherobjects,likelistsorclassinstances).-Ashallowcopyco......
  • Python中级之列表字典推导式和三元运算符
    列表生成式列表生成式是一种在Python中用于创建列表的简洁和优雅的语法。它允许你使用一行代码生成一个新的列表,而不必使用传统的循环语句。以下是列表生成式的基本语法:[expressionforiteminiterableifcondition]expression:用于生成新列表中每个元素的表达式。ite......