Python OpenCV 影像处理:影像轮廓

► 前言

上篇介绍使用OpenCV Python对于图像上的二值化操作,二值化主要用途包括图像分割、物体侦测、文字识别等。这种转换可以帮助检测图像中的物体或特定特征,并提取有用的信息,本篇基于二值化操作进行近一步的操作,透过影像梯度区分影像前景、后景,框选所需目标物件。透过程式码的说明,让各位了解OpenCV Python于图像处理上的基本操作。

►轮廓(Contour)定义

轮廓是由多个点组成的连续曲线或多边形,这些点会包围物体或形状的边界。轮廓描述了物体在影像中的外形和轮廓的形状。这些轮廓提供了对物体形状和结构的描述,可以识别和理解影像中的物体。

►轮廓检测与绘制

OpenCV提供findContours()函数用于在二值化影像中寻找轮廓。

  1. image: 输入的二值化图像,通常是经过灰度转换和二值化处理后的图像。
  2. mode: 轮廓检测模式。它指定轮廓的检索模式,可以使用以下值之一:
    • RETR_EXTERNAL:只检测最外层的轮廓。
    • RETR_LIST:检测所有的轮廓,但不建构轮廓的层次结构。
    • RETR_CCOMP:检测所有的轮廓,并将其组织为两级层次结构。
    • RETR_TREE:检测所有的轮廓,并将其组织为完整的层次结构。
  3. method: 轮廓的逼近方法。它指定轮廓的逼近方法,可以使用以下值之一:
    • CHAIN_APPROX_NONE:储存所有的轮廓点,不进行逼近。
    • CHAIN_APPROX_SIMPLE:仅储存水平、垂直和对角线端点,压缩水平、垂直和对角线节点,只保留该方向上的终点。
  4. contours(可选): 轮廓的输出列表,每个轮廓是一个由点构成的 numpy 数组。
  5. hierarchy(可选): 输出的层次结构,描述了轮廓之间的嵌套关系。
  6. offset(可选): 输入图像的可选偏移参数。

并透过drawContours()函数将轮廓叠加于原始图像上。

  1. image: 用于绘制轮廓的图像。
  2. contours: 要绘制的轮廓,是一个包含轮廓的列表,每个轮廓是一个由点构成的 numpy 数组。
  3. contourIdx: 指定要绘制的轮廓的索引。如果为负值(例如 -1),则绘制所有轮廓。
  4. color: 绘制轮廓的颜色。它是一个包含三个整数的元组,分别表示蓝色、绿色和红色通道的值。
  5. thickness(可选): 绘制轮廓的线条宽度。如果 thickness 为正值,表示线条的粗细;如果 thickness 为负值或者等于 0,则轮廓内部被填充。
  6. lineType(可选): 绘制轮廓的线条类型。预设为 LINE_8,表示 8 连通线条。你也可以使用 cv2.LINE_AA 以获得抗锯齿效果。
  7. hierarchy(可选): 描述轮廓层次结构的 numpy 数组。在 findContours 中获取,通常不需要手动指定。
  8. maxLevel(可选): 绘制轮廓的最大层级。如果不指定,则绘制所有层级的轮廓。
  9. offset(可选): 输入图像的可选偏移参数。

在轮廓检测与绘制分为以下四个步骤:

  • 读取图像并转为灰度图
  • 灰度图像二值化
  • 检测轮廓
  • 绘制轮廓


 

►轮廓周长与面积计算

在 OpenCV 中,可以使用 cv2.arcLength 函数来计算轮廓的周长,使用 cv2.contourArea 函数来计算轮廓的面积。

  • contour:要计算周长的轮廓。
  • closed:一个布尔值,表示轮廓是否是封闭的。如果是封闭的,则 closed 设为 True;如果不是封闭的,则设为 False。

  • contour:要计算面积的轮廓。 

►小结

透过以上讲解,搭配程式码进行范例讲解,相信各位对于图像上的轮廓检测能有更深刻的理解,期待下一篇博文吧!

►Q&A

 问题一:图像不是二值化的,如何进行轮廓检测?

在进行轮廓检测之前,必须将图像转换为二值化形式。可以使用灰度转换和阈值处理来实现。确保你的图像经过适当的预处理。

问题二:找不到预期的轮廓,检测效果不好。

调整二值化的阈值或使用自适应阈值处理。有时候,图像的光线和对比度变化可能导致检测效果不佳,可以先进行适当的图像增强。

问题三:图像中有噪音或小的斑点,影响轮廓检测。

在进行轮廓检测之前,进行图像平滑处理,例如使用高斯滤波器或中值滤波器,以减少噪音的影响。

问题四:轮廓太多或太少,难以准确识别目标。

调整二值化的阈值,以控制检测到的轮廓数量。另外,可以使用形态学运算进行轮廓的调整和修复。

问题五:轮廓检测后如何进一步处理找到的轮廓?

根据应用需求,可以使用轮廓的特性进行进一步的筛选、过滤或分析。例如,可以根据轮廓的面积、长宽比等进行筛选,以排除不需要的轮廓。

►参考资料 

OpenCV - Open Computer Vision Library

欢迎登录大大通,了解更多原厂技术方案、学习教程吧!


http://www.ppmy.cn/embedded/97278.html

相关文章

掌握ChatGPT写作艺术:从入门到精通的四个层次

这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作,我归纳了以下规律,希望能为你带来启发。 一、写作步骤 撰写一篇文章,思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…

设计模式--单例模式

单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式经常用于系统中只需要一个实例的对象,例如日志管理器、数据库连接池、线程池等。 下面是几种常见的单例模式实现方式: 懒汉式&#x…

SQL - 事务

事务是代表单个工作单元的一组SQL语句,当我们需要对数据库进行多次更改的情况下,要使用事务,我们希望所有这些更改作为一个单元一起成功或失败事务属性 (ACID) 原子性(Atomicity):事务中的所有操作要么全部完成,要么全…

群晖NAS本地搭建可远程交互的大型语言模型LLM聊天机器人

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 前言 本文主要分享如何在群晖NAS本地部署并运行一个基于大语言模型Llama 2的个人本地聊天机器人并结合内网穿透工具…

elasticsearch的高亮查询三种模式查询及可能存在的问题

目录 高亮查询使用介绍 高亮参数 三种分析器 可能存在的查询问题 fvh查询时出现StringIndexOutOfBoundsException越界 检索高亮不正确 参考文档 高亮查询使用介绍 Elasticsearch 的高亮(highlight)可以从搜索结果中的一个或多个字段中获取突出显…

使用Requests库发送GET和POST请求的实用指南

使用Requests库发送GET和POST请求的实用指南 在现代Web开发和数据分析中,HTTP请求是与Web服务和API交互的基本方式。Python的requests库是一个强大且易于使用的HTTP库,能够简化发送HTTP请求的过程。本文将详细介绍如何使用requests库发送GET和POST请求,包括基本用法、参数传…

mysql Ubuntu安装与远程连接配置

一、安装(Ubuntu22环境安装mysql8) 这里使用Xshell链接Ubuntu和mysql windows进行操作,特别提醒:安装之前建议对Ubuntu快照处理备份,避免安装中出错导致Ubuntu崩溃。 查看是否安装的有可以用指令:ps -ef|…

Unity3D 自定义窗口

Unity3D 自定义窗口的实现。 自定义窗口 Unity3D 可以通过编写代码,扩展编辑器的菜单栏和窗口。 简单的功能可以直接一个菜单按钮实现,复杂的功能就需要绘制一个窗口展示更多的信息。 编辑器扩展的脚本,需要放在 Editor 文件夹中。 菜单栏…

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…

Java面试题———RabbitMQ篇

目录 1.你们项目中哪里用到了RabbitMQ 2、为什么会选择使用RabbitMQ 3、使用RabbitMQ如何保证消息不丢失 4、消息的重复消费问题如何解决的 5、如何解决消息堆积在MQ的问题 6、RabbitMQ如何保证消费的顺序性 7、RabbitMQ的延迟队列有了解过嘛 8、RabbitMQ如何设置消息过…

操作DOM和事件处理:与用户交互

在现代网页开发中,与用户交互是至关重要的一部分。通过操作DOM元素和处理用户事件,我们可以让网页变得更加动态和响应。本文将通过一个制作动态待办事项列表的案例,帮助你掌握DOM选择器、事件监听器和事件处理的基本知识。 任务目标 通过本教程,你将学习并掌握: 使用DOM…

CentOS 7安装流程详细教程

CentOS 7安装流程详细教程 CentOS(Community Enterprise Operating System)是基于Red Hat Enterprise Linux(RHEL)源代码重新编译而成的免费开源操作系统,广泛用于服务器和企业环境。由于其稳定性和兼容性&#xff0c…

Eureka入门指南:微服务注册与发现的基础概念

Eureka入门指南:微服务注册与发现的基础概念 引言 随着微服务架构的普及,微服务之间的高效通信和管理成为了开发和运维的核心挑战之一。为了解决服务发现和管理问题,Netflix推出了Eureka,一个功能强大的服务注册和发现工具。Eur…

【区块链+金融服务】企链通金融服务平台 | FISCO BCOS应用案例

据供应链行业观察不完全统计,2021 年共有 93 家各类供应链金融平台上线、启动、落地首笔业务或完成系统招 标。为适应跟上供应链金融行业的发展,深圳市企企通科技有限公司积极响应国家政策,为企业引入基于 FISCO BCOS 区块链技术的供应链金融…

QT中Charts基本用法

QT中Charts基本用法 第一步:创建工程,添加Charts库 第二步:添加charts视图 注意要打上对钩 第三步:添加所需成员 第四步:编写初始化函数 第五步:添加测试数据

Spring中SimpleJndiBeanFactory

SimpleJndiBeanFactory 是 Spring Framework 早期版本中的一个类,用于提供对 JNDI(Java Naming and Directory Interface)资源的简单访问。JNDI 是 Java EE 中的一个标准 API,允许 Java 应用程序访问命名和目录服务,如…

Mongodb、redis、mysql、mssql、oracle、PostgreSQL服务简介和默认运行端口

MongoDB 简介: MongoDB 是一个开源的 NoSQL 文档数据库,使用类似 JSON 的 BSON 格式存储数据。它是一个高性能、高可用、自动伸缩的分布式数据库。默认端口: 27017 Redis 简介: Redis 是一个开源的内存数据库,常用作缓存和消息队列代理。它支持多种数据结构,如字符串、哈希、列…

★ C++基础篇 ★ vector 类

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…

Etcd:分布式键值存储的基石

Etcd 是一个分布式的、一致性的键值存储系统&#xff0c;由 CoreOS 设计并开源。它主要用于共享配置和服务发现&#xff0c;并且被广泛应用于 Kubernetes、Docker 和其他云原生工具中作为核心组件之一。Etcd 使用 Raft 一致性算法来保证数据的一致性&#xff0c;使得它非常适合…

C语言 | Leetcode C语言题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; struct hash_table {int key;int val;// 查看 https://troydhanson.github.io/uthash/ 了解更多UT_hash_handle hh; };typedef struct hash_table* hash_ptr;struct pair {int first;int second; };void swap(struct pair* a, struct pair*…