计算机图像处理:图像轮廓

news2024/11/17 23:53:37

图像轮廓

图像阈值分割主要是针对图片的背景和前景进行分离,而图像轮廓也是图像中非常重要的一个特征信息,通过对图像轮廓的操作,就能获取目标图像的大小、位置、方向等信息。画出图像轮廓的基本思路是:先用阈值分割划分为两类图像,再去寻找轮廓。OpenCV中使用cv2.findContours(image,mode,method)函数来寻找图像轮廓,其中参数imagemodemethod分别为输入的图像、轮廓搜索模式(决定了轮廓的提取方式)、轮廓近似方法(决定了如何表达轮廓)。mode轮廓的检索模式有:

cv2.RETR_EXTERNAL表示只检测外轮廓;

cv2.RETR_LIST表示检测的轮廓不建立等级关系;

cv2.RETR_CCOMP表示建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层;

cv2.RETR_TREE表示建立一个等级树结构的轮廓。

method轮廓的近似办法有:

cv2.CHAIN_APPROX_NONE表示存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即maxabsx1-x2),absy2-y1))==1

cv2.CHAIN_APPROX_SIMPLE表示压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息;

    cv2.CHAIN_APPROX_TC89_L1CV_CHAIN_APPROX_TC89_KCOS表示使用teh-Chinl chain 近似算法。

cv2.findContours()函数的输出信息contourshierarchy分别为返回的轮廓和图像的拓扑信息(轮廓层次)。如果想要显示出图像轮廓,还需要使用OpenCV中的cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)函数来绘制出图像轮廓,其中imagecontourscontourIdxcolor分别为输入的图像、绘制的轮廓、轮廓填充和轮廓的颜色。

示例代码

def f_contours():
    img = cv.imread("cup.jpg")
    # draw会改变原图,这里做一个备份
    img_copy = img.copy()
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    ret, thresh = cv.threshold(gray, 128, 255, cv.THRESH_BINARY)
    cv_show(thresh)
    # 这个函数只支持接收单颜色通道图像,否则报错
    contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
    print(len(contours))
    result = cv.drawContours(img_copy, contours, -1, (0, 0, 255), 2)
    cv_show(result)

效果图片 

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

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

相关文章

Textpad 缺少Java编译和运行功能

一、问题 缺少Java编译和运行功能 二、处理方法 1、点击菜单Configure->Preferences 2、点击 Tools -> Add -> Java SDK Commands 3、点击应用和确认 三、结果

现代 GPU 容易受到新 GPU.zip 侧通道攻击

来自四所美国大学的研究人员开发了一种新的 GPU 侧通道攻击,该攻击利用数据压缩在访问网页时泄露现代显卡中的敏感视觉数据。 研究人员通过 Chrome 浏览器执行跨源 SVG 过滤器像素窃取攻击,证明了这种“ GPU.zip ”攻击的有效性。 研究人员于 2023 年 …

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

mysql面试题2:说一说MySQL的架构设计?一条 MySQL 语句执行的步骤?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MySQL的架构设计? MySQL的架构设计主要包括以下几个组件: 连接器(Connector):负责与客户端建立连接,并进行身份验证和授权。 查询缓存…

文件的随机读写函数:fseek

目录 函数介绍: fseek: 原型: 参数说明: int origin: 举例: 文件内容展示: 正常的使用fgetc函数: 结果: 使用了fseek之后: SEEK_SET :从开始位置进行…

VBA技术资料MF60:从二维变体数组中删除一列数据

【分享成果,随喜正能量】如果一个人能看破红尘,特别是如果能看破贪欲的本质,他的身心一定会非常自在,外在的气色会很好,内心也会非常安乐。如果一个人总是贪执某人,那他的戒律肯定不会清净,他的…

渗透测试之打点

请遵守中华人民共和国网络安全法 打点的目的是获取一个服务器的控制权限 1. 企业架构收集 (1)官网 (2)网站或下属的子网站,依次往下 天眼查 企查查 2. ICP 备案查询 ICP/IP地址/域名信息备案管理系统 使用网站…

轮廓检测及透视变换

文章目录 注:代码来自b站:阿头目G # 导入工具包 import numpy as np import argparse import cv2# # 设置参数 # ap argparse.ArgumentParser() # ap.add_argument("-i", "--image", required True, # help "Path to the i…

flutter GetMaterialAPP unknownRoute 失效

这个问题。。。找了半天,最后去了 官网的ISSu找到了答案,分享给同样困惑的小伙伴们 为了让unknownRoute能成功工作, 你的initialRoute一定不能是/, 否则当有未定义的导航时, Get只会跳到initialRoute页面去了. GetPage 里面不要把root设置为“/” 页面&a…

支付宝支付模块开发

生成二维码 使用Hutool工具类生成二维码 引入对应的依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.5</version> </dependency><dependency><groupId>com.go…

Oracle表锁了怎么办?

最近同事在开发过程中&#xff0c;由于网络或电脑卡顿导致PLSQL执行 update 语句操作一直无响应。随后同事就将PLSQL关闭重新打开再次执行 update 语句。来来回回操作了多次。最终导致了表被锁定。 解决问题 1、查看锁表情况 ---1、查看那些表被锁住 select b.owner, b.objec…

学之思项目第一天-完成项目搭建

一、前端 拉下前端代码执行 npm i 然后执行npm run serve就行了 二、后端 搭建父子模块 因为这个涉及到前台以及后台管理所以使用父子模块 并且放置一个公共模块&#xff0c;放置公共的依赖以及公共的代码 2.1 搭建父子工程 这个可以使用直接一个个的maven模块&#xff…

【网络协议】UDP

UDP协议与TCP协议都是传输层协议&#xff0c;应用层把数据拷贝到传输层&#xff0c;后续动作由下层自行决定。 UDP协议端格式 16位 UDP 长度 , 表示整个数据报 (UDP 首部 UDP 数据 ) 的最大长度 ;&#xff08;也就是65535字节&#xff09; 如果校验和出错 , 就会直接丢弃 ; …

湖南软件测评公司简析:软件功能测试和非功能测试的联系和区别

一、软件功能测试   软件功能测试旨在验证软件是否按照需求规格说明书的要求正常工作。具体而言&#xff0c;功能测试会对软件的所有功能进行测试&#xff0c;以确保其满足用户的需求和预期。在进行功能测试时&#xff0c;根据需求规格说明书编写测试用例&#xff0c;并在测试…

初识Java 11-1 函数式编程

目录 旧方式与新方式 lambda表达式 方法引用 Runnable 未绑定方法引用 构造器方法引用 函数式接口 带有更多参数的函数式接口 解决缺乏基本类型函数式接口的问题 本笔记参考自&#xff1a; 《On Java 中文版》 函数式编程语言的一个特点就是其处理代码片段的简易性&am…

从零开始之了解电机及其控制(10)空间矢量理论

与一维数字转子位置不同&#xff0c;电流和电压都是二维的。可以在矩形笛卡尔平面中考虑这些尺寸。 用旋转角度和幅度来描述向量 虽然电流命令的幅度和施加的电压是进入控制器的误差项的函数&#xff0c;它们施加的角度是 d-q 轴方向的函数&#xff0c;因此也是转子位置的函数。…

目标追踪学习经验总结

标题目标追踪算法学习经验总结   最近对目标追踪算法进行了学习&#xff0c;以下是我的学习经验&#xff0c;如有不对之处&#xff0c;欢迎大家指正。 1、简介 1.1 定义 目标跟踪是通过分析视频图片序列&#xff0c;对检测出的各个候选目标区域实施匹配&#xff0c;定位出这…

架构设计师

一、软件架构 .特定领域软件架构(Domain Specific Software Architecture,DSSA) &#xff08;1&#xff09;垂直域。定义了一个特定的系统族,导出在该领域中可作为系统的可行解决方案的一个通用软件架构。 &#xff08;2&#xff09;水平域。定义了在多个系统和多个系统族中功…

pt28django教程

缓存 缓存是一类可以更快的读取数据的介质统称&#xff0c;读取硬盘、较复杂的计算、渲染都会产生较大的耗时。数据变化频率不会很高的场景适合使用缓存。使用缓存场景&#xff1a;博客列表页、电商商品详情页、缓存导航及页脚。 Django中设置缓存 Django中提供多种缓存方式…

解决 MyBatis-Plus 中增加修改时,对应时间的更新问题

问题&#xff1a;在添加修改时&#xff0c;对应的 create_time 与 insert_time 不会随着添加修改而自动的更新时间 第一步&#xff1a;首先在对应的属性上&#xff0c;加上以下注解 如果只添加以下注解&#xff0c;在增加或者修改时&#xff0c;可能对应的 LocalDateTime 会出…