python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注

news2025/7/9 12:02:34

【1】引言

前序学习进程中,已经初步探索了对图像轮廓的矩形标注和圆形标注:

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注-CSDN博客

但实际上,这两种标注方法都是大致的,不够精细,且在图像颜色稍微复杂的时候,就因为轮廓层数太多就无法画出合适的矩形或者圆形。

本次学习的目的,就是尽可能沿着图像的轮廓来画这个标注的包络线,也就是调用cv2.convexHull()函数进行凸包标注。

凸包标注画的标注线彼此之间都是钝角,相比于矩形或者圆形标注,对图像的包络更近了一些。

【2】官网教程

点击下方链接,直达cv2.convexHull()函数的官网教程:

OpenCV: Structural Analysis and Shape Descriptors

官网页面对 cv2.convexHull()函数的说明为:

图1  官网页面对 cv2.convexHull()函数的说明

具体的,官网页面对 cv2.convexHull()函数的参数说明为:

cv.convexHull     (     

        InputArray     points,            #输入点阵数据
        OutputArray     hull,             #输出凸包数据
        bool     clockwise = false,    #如果为True,按照顺时针画凸包,为False则逆时针画凸包,可选参数
        bool     returnPoints = true ) #返回值类型,为True时返回坐标值,可选参数

【3】代码测试

和之前一样,cv2.convexHull()函数要想用凸包作为标签标注图形的轮廓,需要提前知晓图像的轮廓位置,所以依然要调用 cv2.findContours()函数来找到轮廓。

cv2.boundingRect()函数和cv2.findContours()函数有一个共同点,就是必须要对灰度图像才有效,所以必须提前调用cv2.cvtColor()函数转换灰度图,而为了更进一步突出灰度图,有时候需要调用cv2.threshold()函数进行阈值处理。

如果对上述函数不熟悉,可以通过下述链接回忆:

python学opencv|读取图像(六十四)使用cv2.findContours()函数+cv2.drawContours()函数实现图像轮廓识别和标注-CSDN博客

python学opencv|读取图像(十一)彩色图像转灰度图的两种办法_识别图像输出灰度图-CSDN博客

按照上述分析的逻辑,代码设置为:引入必要模块和图像,图像灰度处理,图像阈值处理,给灰度图像找边界轮廓,然后是绘制凸包标注。

此处直接给出完整代码:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
src = cv.imread('df.png') #读取图像srcx.png
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #将图像转化为灰度图

#图像处理
t,dst=cv.threshold(gray,127,255,cv.THRESH_BINARY) #阈值处理
con,hierarchy=cv.findContours(dst,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE) #读取边界
x=cv.convexHull(con[0]) #获取轮廓的凸包
cv.polylines(src,[x],True,(0,100,255),12)
#cv.imshow('ini-image ', dst) #显示原始图像
cv.imshow('ini-image-con', src) #显示带轮廓线图像
#cv.imshow('ini-image-gon', gray) #显示带轮廓线图像
cv.imwrite('ini-image-tb.png', src)
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行的相关图像有:

图2 初始图像

图3 加凸包图像 

由图2和图3可见,图像识别成功,并且画上了凸包标注框。

【4】细节说明

在使用纯黑白图像时,顺利获得了如图3所示的凸包标注效果。

如果图像稍微复杂一些,是否效果依旧显著。

将输出图像更换进行测试:

图5 新初始图像

图6 实际运行效果-标注了一个点

实际上,如果在代码中继续读取图像的轮廓层,会发现新图像的轮廓层数很多,因此无法选取合适的轮廓层来进行凸包点阵选择,最后也就无法勾勒出好的凸包边框。

和矩形。圆形标注一样,凸包标注也是在处理简单的纯黑白图像时效果更好。

【5】总结

掌握了python+opencv通过使用cv2.convexHull()函数对图像轮廓进行凸包标注的技巧。

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

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

相关文章

基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 个人中心界…

前端带样式导出excel表格,html表格生成带样式的excel表格

众所周知&#xff0c;前端生成表格通常是用xlsx、excel.js等js库&#xff0c;但这些库想要生成时增加excel样式会很麻烦。 有这么一个js库把html表格连样式带数据一并导出为excel表格: html-table-to-excel npm install html-table-to-excel 使用 html表格&#xff1a; <…

【Linux】【网络】Libevent 内核实现简略版

【Linux】【网络】Libevent 内核实现简略版 1 event_base结构–>相当于Reactor 在使用libevent之前&#xff0c;就必须先创建这个结构。 以epoll为例&#xff1a; 1.1evbase void* evbase-->epollop结构体&#xff08;以epoll为例&#xff09; libevent通过一个void…

VScode内接入deepseek包过程(本地部署版包会)

目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama&#xff0c;我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后&#xff0c;依次点击添加模型 5. 在这里可以添加&#xff0c;各种各样的模型&#xff0c;选择我们的ollama 6. 选…

Ubuntu虚拟机NDK编译ffmpeg

目录 一、ffmpeg源码下载1、安装git(用于下载ffmpeg源码)2、创建源码目录&#xff0c;下载ffmpeg源码 二、下载ubuntu对应的NDK&#xff0c;并解压到opt下1、下载并解压2、配置 ~/.bashrc 三、源码编译、1、创建编译脚本2、脚本文件内容3、设置可执行权限并运行4、编译的结果在…

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 K 邻近算法&#xff08;K-Nearest Neighbors&#xff0c;简称 KNN&#xff09;是一种经典的机器学习算法&#xff0c;主要用于分类和回归任务…

讯飞唤醒+VOSK语音识别+DEEPSEEK大模型+讯飞离线合成实现纯离线大模型智能语音问答。

在信息爆炸的时代&#xff0c;智能语音问答系统正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着数据泄露事件的频发&#xff0c;用户对于隐私保护的需求日益增强。想象一下&#xff0c;一个无需联网、即可响应你所有问题的智能助手——这就是纯离线大模型智能语音…

Day4 25/2/17 MON

【一周刷爆LeetCode&#xff0c;算法大神左神&#xff08;左程云&#xff09;耗时100天打造算法与数据结构基础到高级全家桶教程&#xff0c;直击BTAJ等一线大厂必问算法面试题真题详解&#xff08;马士兵&#xff09;】https://www.bilibili.com/video/BV13g41157hK?p4&v…

HTML【详解】input 标签

input 标签主要用于接收用户的输入&#xff0c;随 type 属性值的不同&#xff0c;变换其具体功能。 通用属性 属性属性值功能name字符串定义输入字段的名称&#xff0c;在表单提交时&#xff0c;服务器通过该名称来获取对应的值disabled布尔值禁用输入框&#xff0c;使其无法被…

Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录 前言功能预览样式特点总结&#xff1a;1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结&#xff1a;1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…

用React实现一个登录界面

使用React来创建一个简单的登录表单。以下是一个基本的React登录界面示例&#xff1a; 1. 设置React项目 如果你还没有一个React项目&#xff0c;你可以使用Create React App来创建一个。按照之前的步骤安装Create React App&#xff0c;然后创建一个新项目。 2. 创建登录组…

图论:tarjan 算法求解强连通分量

题目描述 有一个 n n n 个点&#xff0c; m m m 条边的有向图&#xff0c;请求出这个图点数大于 1 1 1 的强连通分量个数。 输入格式 第一行为两个整数 n n n 和 m m m。 第二行至 m 1 m1 m1 行&#xff0c;每一行有两个整数 a a a 和 b b b&#xff0c;表示有一条…

Java:单例模式(Singleton Pattern)及实现方式

一、单例模式的概念 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例&#xff0c;是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景&#xff0c;例如日志记录器、配置管理、线程池、数据库…

Python爬虫实战:股票分时数据抓取与存储 (1)

在金融数据分析中&#xff0c;股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况&#xff0c;从而为交易决策提供依据。然而&#xff0c;获取这些数据往往需要借助专业的金融数据平台&#xff0c;其成本较高。幸运的是&#xff0c;通过…

将图片base64编码后,数据转成图片

将图片数据进行base64编码后&#xff0c;可以在浏览器上查看图片&#xff0c;只需在前端加上data:image/png;base64,即可 在线工具&#xff1a; Base64转图片 - 加菲工具

天翼云910B部署DeepSeek蒸馏70B LLaMA模型实践总结

一、项目背景与目标 本文记录在天翼云昇腾910B服务器上部署DeepSeek 70B模型的全过程。该模型是基于LLaMA架构的知识蒸馏版本&#xff0c;模型大小约132GB。 1.1 硬件环境 - 服务器配置&#xff1a;天翼云910B服务器 - NPU&#xff1a;8昇腾910B (每卡64GB显存) - 系统内存&…

Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常

1.问题描述 硬件: AGX Orin 在Jetpack 5.0.1和Jetpack 5.0.2上测试验证 图像分辨率在1920x720和1024x1920下图像采集正常 但是当采集图像分辨率为1924x720视频时,图像输出异常 像素格式:yuv_uyvy16 gstreamer命令如下 gst-launch-1.0 v4l2src device=/dev/video0 ! …

DeepSeek冲击(含本地化部署实践)

DeepSeek无疑是春节档最火爆的话题&#xff0c;上线不足一月&#xff0c;其全球累计下载量已达4000万&#xff0c;反超ChatGPT成为全球增长最快的AI应用&#xff0c;并且完全开源。那么究竟DeepSeek有什么魔力&#xff0c;能够让大家趋之若鹜&#xff0c;他又将怎样改变世界AI格…

CF 144A.Arrival of the General(Java实现)

题目分析 一个n个身高数据&#xff0c;问最高的到最前面&#xff0c;最矮的到最后面的最短交换次数 思路分析 首先&#xff0c;如果数据有重复项&#xff0c;例如示例二中&#xff0c;最矮的数据就是最后一个出现的数据位置&#xff0c;最高的数据就是最先出现的数据位置&…