轮廓检测与处理

news2024/11/22 9:27:42

轮廓检测

先将图像转换成二值

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 变为二值,大于127置为255,小于100置为0.

使用cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)函数读取轮廓

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# contours:轮廓信息   hierarchy:层级
# cv2.RETR_TREE:检测所有轮廓,并重构嵌套轮廓的整个层次
# cv2.CHAIN_APPROX_NONE:freeman链码方式输出轮廓,所有其他方式输出多边形(顶点的序列)

绘图

-1表示画出全部轮廓,0,1,2依次为第1,2,3个轮廓
(0, 0, 255)bgr表示画红色
2表示线条宽度

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
# -1表示画出全部轮廓,(0, 0, 255)bgr表示画红色,2表示线条宽度

结果

show.cv_show('iron', img)
show.cv_show('thresh', thresh)
show.cv_show('res', res)

原图
原图
二值图
二值图
轮廓图
轮廓

轮廓特征

先提取另一幅图的轮廓

img2 = cv2.imread('duobianxing.png')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 灰度图
ret2, thresh2 = cv2.threshold(gray2, 127, 255, cv2.THRESH_BINARY)  # 变为二值,大于127置为255,小于100置为0.
contours2, hierarchy2 = cv2.findContours(thresh2, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
draw_img2 = img2.copy()
res2 = cv2.drawContours(draw_img2, contours2, -1, (0, 0, 255), 2)  # -1表示画出所有轮廓
show.cv_show('duobianx', img2)
show.cv_show('res', res2)

在这里插入图片描述
在这里插入图片描述
提取第一个轮廓

cnt = contours2[0]

面积

area = cv2.contourArea(cnt) 

在这里插入图片描述

周长

length = cv2.arcLength(cnt, True)  # 周长,True表示闭合

在这里插入图片描述

轮廓近似

设置一个阈值,越小越接近原轮廓

yuzhi = 0.01*cv2.arcLength(cnt, True)  # 阈值
approx = cv2.approxPolyDP(cnt, yuzhi, True)
draw_img2 = img2.copy()
res2 = cv2.drawContours(draw_img2, [approx], -1, (0, 0, 255), 2)
show.cv_show('res2', res2)

阈值为0.1倍周长时
在这里插入图片描述
阈值为0.01倍周长时
在这里插入图片描述

边界矩形

x, y, w, h = cv2.boundingRect(cnt)
ju = cv2.rectangle(img2, (x, y), (x+w, y+h), (0, 255, 0), 2)
show.cv_show('ju', ju)

在这里插入图片描述
轮廓面积与边界矩形面积之比

area2 = cv2.contourArea(cnt)
ju_area = w * h
bi = float(area2) / ju_area
print('轮廓面积与边界矩形面积之比', bi)

在这里插入图片描述

外接圆

(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
yuan = cv2.circle(img2, center, radius, (0, 255, 0), 2)
show.cv_show('yuan', yuan)

在这里插入图片描述

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

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

相关文章

【Unity入门】热更新框架之xLua

目录 一、xLua概述1.1xLua简介1.2xLua安装 二、Lua文件加载2.1执行字符串2.2加载Lua文件2.3自定义loader 三、xLua文件配置3.1打标签3.2静态列表3.3动态列表 四、Lua与C#交互4.1 C#访问Lua4.1.1 获取一个全局基本数据类型4.1.2 访问一个全局的table4.1.3 访问一个全局的functio…

【Unity美术】Unity工程师对3D模型需要达到的了解【一】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

机器学习之K-means聚类

概念 K-means是一种常用的机器学习算法,用于聚类分析。聚类是一种无监督学习方法,它试图将数据集中的样本划分为具有相似特征的组(簇)。K-means算法的目标是将数据集划分为K个簇,其中每个样本属于与其最近的簇中心。 以下是K-means算法的基本步骤: 选择簇的数量(K值)…

算法分析与设计基础

一、绪论 1.算法的概念及特征 1.1 定义: 算法是指求解某个问题或是某类问题的一系列无歧义的指令,也就是说,对于符合一定规范的输入,能够在有限时间内获得所要求的输出。 1.2 特征: 输入:算法中的各种运…

Prometheus通过consul实现自动服务发现

环境,软件准备 本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本: System: CentOS Linux release 7.6Docker: 24.0.5Prometheus: v2.37.6Consul: 1.6.1 注意:这里为了方便启动 Prometheus、Consul服…

电容器50ZLH56MEFC6.3X11

电容器 常用电子元器件类型 50ZLH56MEFC6.3X11 文章目录 电容器前言一、电容器二、50ZLH56MEFC6.3X11总结前言 电容器在电子电路中有许多重要的应用,如滤波、耦合、储能、定时等。不同类型的电容器具有不同的性能特点,例如电容量、工作电压、频率响应等。在选择和使用电容…

const变量真的不能修改吗?

文章目录 1 在Linux系统下1.1 系统参数1.2 通过指针修改(编译器有警告) 2 在Windows下2.1 系统参数2.2 直接修改2.3 指针间接修改2.4 指针间间接修改 3 总结: 1 在Linux系统下 1.1 系统参数 内核:Linux version 3.2.0-24-generi…

Glary Utilities Pro - 电脑系统优化全面指南:详尽使用教程

软件简介: Glary Utilities Pro 是一款全面的电脑优化工具,它旨在帮助用户提升计算机的性能和稳定性。这款软件提供了多种功能,包括系统清理、优化、修复以及保护。通过一键扫描,它可以识别并清除无用文件、临时数据、注册表错误等…

关于“Python”的核心知识点整理大全50

目录 python_repos.py 17.1.6 概述最受欢迎的仓库 python_repos.py 17.1.7 监视 API 的速率限制 注意 17.2 使用 Pygal 可视化仓库 python_repos.py 17.2.1 改进 Pygal 图表 python_repos.py 往期快速传送门👆(在文章最后)&#xf…

SAP问题 OPEN SQL 取不到值

关键:数据库中有数据,但是open sql取不到数据 背景: 标准程序在测试环境正常执行,在生产环境报错。 解决过程: 第一步:分析执行结果不一致可能的原因: 1.测试数据问题,可能性小&…

openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码

文章目录 openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码178.1 前提条件178.2 操作步骤 openGauss学习笔记-178 openGauss 数据库运维-逻辑复制-逻辑解码-使用SQL函数接口进行逻辑解码 openGauss可以通过调用SQL函数,…

传奇私服教程,新手小白速速下载!

传奇私服教程,新手小白速速下载! 第二十课-封玩家账号登陆-封玩家机器码登陆.zip 第十九课-快速搭建FTP服务器教程配套工具.zip 第十八课-绿盟GOM1108引擎登陆器配置防劫持列表教... 第十七课-最新访问网站自动弹出加群教程.zip 修复沙城捐献不了或者捐献…

Mybatis行为配置之Ⅳ—日志

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

Python FastApi连接oracle进行查询

这边技术选型是cx_oracle进行连接查询,cx_oracle的使用首先要有官方的客户端才能连接到数据库,python并不自带客户端。我用是Python3.9 安装客户端 可以到官网在选择最新版进行下载。 Instant Client for Microsoft Windows (x64) 64-bit 或者直接从我…

uniapp多级动态表单规则

最近有个新的业务、主要涉及多层级的动态表单提交,其中又涉及很多类型,踩了很多坑之后,终于研发完毕。 传来的数据格式处理 传来的数据格式涉及比较多的内容,以下举例一个,涉及到规则的填写 规则写法有两种&#xff…

【Maven】下载及配置

文章目录 1. 下载2. 解压3. 配置环境变量4. 验证 Maven 是一个跨平台的项目管理工具。作为 Apache 组织的一个颇为成功的开源项目,其主要服务于基于 Java 平台的项目创建,依赖管理和项目信息管理,是一个自动化构建工具,本文将介绍…

Activemq存储KahaDb详解

引言 ActiveMQ在不提供持久化的情况下,数据保存在内存中,一旦应用崩溃或者重启之后,数据都将会丢失,这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。 kahaDB kahaDB是一个基于文件&#xf…

为什么ChatGPT采用SSE协议而不是Websocket?

在探索ChatGPT的使用过程中,我们发现GPT采用了流式数据返回的方式。理论上,这种情况可以通过全双工通信协议实现持久化连接,或者依赖于基于EventStream的事件流。然而,ChatGPT选择了后者,也就是本文即将深入探讨的SSE&…

聚簇索引和非聚簇索引的区别

在 MySQL 中,B 树的实现主要是通过 InnoDB 存储引擎来实现的。InnoDB 存储引擎中的索引主要有聚簇索引和非聚簇索引两种类型,聚簇索引是根据主键创建的索引,⽽非聚簇索引是根据⾮主键列创建的索引。 对于非聚簇索引,MySQL 中会同时…

神经网络 —— 模拟人脑的计算方式

神经网络能够反映人类大脑的行为,允许计算机程序识别模式,以及解决人工智能、机器学习和深度学习领域的常见问题。 人类发明的灵感来源有很多都是来自大自然,神经网络同样如此。人工神经网络是一种类似于人类神经网络的信息处理技术。但事实上…