Opencv图像处理:轮廓检测、轮廓近似、绘制外接圆外接矩形

文章目录

  • 一、图像轮廓检测
    • 1、比较
    • 2、常见的轮廓检测方法
      • 1)基于梯度的方法
      • 2)基于边缘检测器的方法
      • 3)基于阈值的方法
    • 3、查找轮廓与绘制轮廓
    • 4、参数解释
    • 4、代码解释
      • 1)读取原图像灰度图并用二值化显示
      • 2)轮廓绘制
      • 3)通过面积绘制轮廓
  • 二、轮廓特征
    • 1、轮廓面积
    • 2、轮廓周长
  • 三、轮廓近似
    • 1、定义
    • 2、参数说明
    • 3、代码解释
      • 1)图像预处理
      • 2)对轮廓进行近似
  • 四、轮廓外接圆,外接矩形
    • 1、绘制外接圆
    • 2、绘制外接矩形


一、图像轮廓检测

1、比较

边缘检测:主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。
轮廓检测:指检测图像中的对象边界,指的是在图像中提取出物体边界的一种图像处理方法使用轮廓检测可以获得物体的边界,方便在图像中对他们进行定位。通常在一些有趣的应用中轮廓检测是第一处理环节。比如图像前景提取,简单的图像分割,检测以及识别等。

2、常见的轮廓检测方法

1)基于梯度的方法

利用图像中灰度值的梯度信息来检测轮廓,包括Sobel算子、Prewitt算子、Roberts算子等。

2)基于边缘检测器的方法

包括Canny边缘检测器、Laplacian边缘检测器等,这些边缘检测器可以通过检测图像中的强度变化来找到物体的边缘。

3)基于阈值的方法

将图像灰度值与设定的阈值进行比较,将高于或低于阈值的像素点标记为边界。

3、查找轮廓与绘制轮廓

cv2.findContours()
cv2.drawContours()

4、参数解释

查找轮廓的API:image, contours, hierarchy = cv2.findContours(img, mode, method)
参数img:需要实现轮廓检测的原图。

mode: 轮廓的检索模式,主要有四种方式:

  • cv2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略

  • cv2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级

  • cv2.RETR_CCOMP:返回所有的轮廓,只建立两个等级的轮廓。一个对象的外轮廓为第1级组织结构。而对象内部中空洞的轮廓为第2级组织结构,空洞中的任何对象的轮廓又是第1 级组织结构。

  • cv2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。

method:轮廓的近似方法,主要有以下两种:

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。

  • cv2.CHAIN_APPROX_SIMPLE:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。

返回值

  • image:返回处理的原图

  • contours:包含图像中所有轮廓的list对象。其中每一个独立的轮廓信息以边界点坐标(x,y)的形式储存在numpy数组中。

  • hierarchy:轮廓的层次结构。一个包含4个值的数组:[Next, Previous, First Child, Parent]

  1. Next:与当前轮廓处于同一层级的下一条轮廓
  2. Previous:与当前轮廓处于同一层级的上一条轮廓
  3. First Child:当前轮廓的第一条子轮廓
  4. Parent:当前轮廓的父轮廓

注意:做轮廓检测前需要将图片读取为二值数据,即像素值只为0和255(非黑即白)。

4、代码解释

1)读取原图像灰度图并用二值化显示

import cv2
phone = cv2.imread('phone.png')#读取原图
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY)#灰度图的处理
cv2.imshow('phone_b',phone_gray)
cv2.waitKey(0)
# phone_gray=cv2.imread('phone.png',0)  #读取灰度图
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)#阈值处理为二值
cv2.imshow('phone_binary',phone_binary)
cv2.waitKey(0)
_,contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
print(hierarchy)
print(len(contours))

在这里插入图片描述
其中:
_,contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
调试一下发现总共找到了9个轮廓:
在这里插入图片描述

2)轮廓绘制

轮廓的绘制
cv2.drawContours(image, contours, contourIdx, color, thickness=None,
lineType=None, hierarchy=None, maxLevel=None, offset=None)
参数含义如下

  • image:要在其上绘制轮廓的输入图像。
  • contours:轮廓列表,通常由cv2.findContours()函数返回。
  • contourIdx:要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。 -1
  • color:轮廓的颜色,以BGR格式表示。例如,(0, 255, 0)表示绿色。
  • thickness:轮廓线的粗细。默认值为1。
  • lineType:轮廓线的类型。默认值为cv2.LINE_8。
  • hierarchy:轮廓层次结构。通常由cv2.findContours()函数返回。
  • maxLevel:绘制的最大轮廓层级。默认值为None,表示绘制所有层级。offset:轮廓点的偏移量。默认值为None。
image_copy = phone.copy()
image_copy = cv2.drawContours(image=image_copy, contours=contours, contourIdx=6,color=(0,255,0),thickness=3)
cv2.imshow('Contours_show', image_copy)
cv2.waitKey(0)

在这里插入图片描述
该图片显示的是contourIdx=6的轮廓。

3)通过面积绘制轮廓

a_list=[]for i in contours:if cv2.contourArea(i)>=10000:a_list.append(i)
image_copy = phone.copy()
image_copy = cv2.drawContours(image=image_copy, contours=a_list, contourIdx=-1,color=(0,255,0),thickness=3)
cv2.imshow('Contours_show_10000', image_copy)
cv2.waitKey(0)

在这里插入图片描述
轮廓大于10000的只有这一个轮廓。

二、轮廓特征

1、轮廓面积

  • cv2.contourArea(contour[, oriented]) → retval
  • contour:顶点构成的二维向量组(如轮廓列表contours中的一个轮廓)
  • oriented:定向区域标志,默认值为 False,返回面积的绝对值,Ture 时则根据轮廓方向返回带符号的数值。
area_0 = cv2.contourArea(contours[0])
print(area_0)
area_1 = cv2.contourArea(contours[1])
print(area_1)

在这里插入图片描述

2、轮廓周长

  • arcLength(InputArray curve, bool closed)
  • curve,输入的二维点集(轮廓顶点),可以是 vector 或 Mat 类型。
  • closed,用于指示曲线是否封闭。
length = cv2.arcLength(contours[0],closed=True)
print(length)

在这里插入图片描述

三、轮廓近似

1、定义

指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。
在这里插入图片描述

2、参数说明

approx = cv2.approxPolyDP(curve, epsilon, closed)

  • curve:输入轮廓。
  • epsilon:近似精度,即两个轮廓之间最大的欧式距离。该参数越小,得到的近似结果越接近实际轮廓;反之,得到的近似结果会更加粗略。
  • closed:布尔类型的参数,表示是否封闭轮廓。如果是 True,表示输入轮廓是封闭的,近似结果也会是封闭的;否则表示输入轮廓不是封闭的,近似结果也不会是封闭的。
  • 返回值:approx:近似结果,是一个ndarray数组,为1个近似后的轮廓,包含了被近似出来的轮廓上的点的坐标

3、代码解释

1)图像预处理

phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY) #转换为灰度图
ret,phone_thresh = cv2.threshold(phone_gray,120,255,cv2.THRESH_BINARY)  #二值化
image, contours, hierarchy = cv2.findContours(phone_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)#获取轮廓

2)对轮廓进行近似

epsilon = 0.01 * cv2.arcLength(contours[0],True)        #设置近似精度
approx = cv2.approxPolyDP(contours[0], epsilon, True)   #对轮廓进行近似
print(approx.shape)
phone_new = phone.copy()
image_contours = cv2.drawContours(phone_new,[approx],contourIdx=-1,color=(0,255,0),thickness=3)#绘制轮廓
cv2.imshow('phone',phone)
cv2.waitKey(0)
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)

在这里插入图片描述
epsilon中的0.01这个值来控制精度,这个值越小绘制轮廓的点越多越精细,值越大点越少,绘制的会更粗糙。

四、轮廓外接圆,外接矩形

1、绘制外接圆

cnt = contours[6] #选择contours[6]特征
(x,y),r = cv2.minEnclosingCircle(cnt)#计算轮廓的外接圆
phone_circle = cv2.circle(phone,(int(x),int(y)),int(r),(0,255,0),2)#绘制外接圆的方法
cv2.imshow('phone_circle',phone_circle)
cv2.waitKey(0)

在这里插入图片描述

2、绘制外接矩形

x,y,w,h = cv2.boundingRect(cnt)#计算轮廓的最小外接矩形
phone_rectangle = cv2.rectangle(phone,(x,y),(x+w,y+h),(0,255,0),2)  #在图像上绘制矩形
cv2.imshow('phone_rectangle',phone_rectangle)
cv2.waitKey(0)

注意:绘制坐标轴X轴是水平向右的;Y轴是竖直向下的。
在这里插入图片描述

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

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

相关文章

精益数据分析(17/126):精益画布与创业方向抉择

精益数据分析(17/126):精益画布与创业方向抉择 大家好!一直以来,我都希望能和大家一起在创业和数据分析的领域中不断探索、共同进步。今天,我们接着深入学习《精益数据分析》,这次聚焦于精益画…

每天五分钟深度学习PyTorch:图像的处理的上采样和下采样

本文重点 在pytorch中封装了上采样和下采样的方法,我们可以使用封装好的方法可以很方便的完成采样任务,采样分为上采样和下采样。 上采样和下采样 下采样(缩小图像)的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。 下采样( 放大图像)的…

代码随想录训练营第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III

198. 打家劫舍 思路: 动规五部曲: 1.dp数组及其下标的意义:dp数组表示当前房屋下偷与不偷的最大盗取金额 2.确定递推公式:因为盗取房屋只能间隔盗取,并且还要取最大值。所以每个房屋都有盗取和不盗取两个选择&…

【AI 加持下的 Python 编程实战 2_09】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上)

DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(上) 1 起因 最近在看去年刚出了第 2 版《Learn AI-assisted Python Programming》,梳理完 第七章 的知识点后,总感觉这一章的话题很好——问题分解能力的培…

使用DeepSeek-Prover-V1.5解决数学问题

DeepSeek-Prover-V1.5-RLRMaxTS是一个结合强化学习和搜索策略的自动定理证明系统。 1. 初等代数:二次方程求解 问题:解方程 x - 5x 6 0 操作步骤: 将问题转换为Coq形式: Theorem quadratic : exists x : Z, x^2 - 5*x 6 0…

3.3 技术框架:LangChain、ReAct、Memory与Tool Integration

随着人工智能技术的飞速发展,智能代理(Agent)已成为企业实现自动化、智能化和个性化服务的核心工具。在2025年,技术框架如LangChain、ReAct、Memory和Tool Integration在构建高效、灵活的AI代理系统中占据了重要地位。这些框架通过…

STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。

1. 启动模式与地址映射 STM32F103 的启动模式由 BOOT0 和 BOOT1 引脚配置决定,不同的启动模式对应不同的存储器映射: 启动模式 映射地址范围 说明 主 Flash 0x08000000~0x0807FFFF 用户程序存储在 Flash 中,复位后从 Flash 启动&#xff08…

【C语言-选择排序算法】实现对十个数进行排序

目录 前言 一、选择排序算法原理 二、选择排序算法实现对十个数进行排序 三、代码运行示例 四、选择排序算法的时间复杂度和空间复杂度分析 五、选择排序算法的优缺点 六、总结 前言 在计算机科学领域,排序算法是基石般的存在,它们就像是整理杂乱…

配置Intel Realsense D405驱动与ROS包

配置sdk使用 Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包_realsense的驱动包-CSDN博客 中的方法一 之后不通过apt安装包,使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…

基于SpringBoot的中华诗词文化分享平台-项目分享

基于SpringBoot的中华诗词文化分享平台-项目分享 项目介绍项目摘要管理员功能图会员功能图系统功能图项目预览会员主页面诗词页面发布问题回复评论 最后 项目介绍 使用者:管理员、会员 开发技术:MySQLJavaSpringBootVue 项目摘要 本文旨在设计与实现一…

ProxySQL 性能调优工具推荐

ProxySQL 的性能优化需结合‌实时监控工具‌与‌自动化分析平台‌,以下为常用工具分类与推荐: 一、‌内置诊断工具‌ ProxySQL Admin 接口‌ 通过内置管理表直接分析性能数据: sql Copy Code SELECT * FROM stats_mysql_query_digest; – 高频查询分析(执行次数、平均耗…

unity TEngine学习记录3

上一篇讲了怎么使用te框架,本篇主要学习的是UI,一个游戏百分之70%都是UI的展示效果,现在让我们继续打开te官网找到UI部分继续学习。 ui创建以及加载 我们根据文档首先打开命名规则界面,大家第一次看就知道这个是干啥的,你想使用此…

23种设计模式-创建型模式之单例模式(Java版本)

Java 单例模式(Singleton Pattern)详解 🌟 什么是单例模式? 单例模式确保一个类只有一个实例,并提供一个全局访问点来访问它。 🧠 使用场景 配置管理类(如读取配置文件)日志工具类…

2025能源网络安全大赛CTF --- Crypto wp

文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章!!! simpleSignin 题目: from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…

加密与解密完全指南,使用Java实现

文章目录 1. 加密基础知识1.1 什么是加密?1.2 加密的历史简介1.2.1 古典加密1.2.2 现代加密的起源 1.3 加密的基本概念1.3.1 密码学中的关键术语1.3.2 加密的基本原则 1.4 加密的分类1.4.1 对称加密(Symmetric Encryption)1.4.2 非对称加密&a…

十一、数据库day03--SQL语句02

文章目录 一、查询语句1. 基本查询2. 条件查询2.1 ⽐较运算符&逻辑运算符2.2 模糊查询2.3 范围查询2.4 判断空 3. 其他复杂查询3.1 排序3.2 聚合函数3.3 分组3.4 分页查询 二、回顾1. 使⽤ Navicat ⼯具中的命令列2.命令⾏基本操作步骤 提示:以下是本篇文章正文…

Flowable 与 bpmn.io@7.0 完整集成示例 Demo

Flowable 与 bpmn.io7.0 完整集成示例 Demo 下面是一个完整的前后端集成示例&#xff0c;包含前端使用 bpmn.js 7.0 和与 Flowable 后端交互的实现。 1. 后端实现 (Spring Boot Flowable) 1.1 添加依赖 (pom.xml) <dependencies><!-- Spring Boot --><depe…

ROS2 安装详细教程,Ubuntu 22.04.5 LTS 64 位 操作系统

一、完整安装流程&#xff08;推荐&#xff09; 1. 安装依赖工具 sudo apt update && sudo apt install -y software-properties-common curl gnupg2 2. 添加 ROS 2 GPG 密钥 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /…

STM32 基本GPIO控制

目录 GPIO基础知识 ​编辑IO八种工作模式 固件库实现LED点灯 蜂鸣器 按键基础知识 ​编辑继电器 震动传感器 433M无线模块 GPIO基础知识 GPIO(General-Purpose input/output,通用输入/输出接口) 用于感知外部信号&#xff08;输入模式&#xff09;和控制外部设备&…

14.Chromium指纹浏览器开发教程之WebGL指纹定制

WebGL指纹概述 当在浏览器打开的网页上浏览内容时&#xff0c;看到的大多是平面的、静态的图像和文字。但是有时想要在网页上看到更加生动、立体的图像&#xff0c;如3D游戏、虚拟现实应用等。这时&#xff0c;就需要用到WebGL。 简单来说&#xff0c;WebGL&#xff08;Web G…