《OpenCV计算机视觉》—— 图像轮廓检测与绘制

news2024/11/14 6:11:53

文章目录

  • 一、轮廓的检测
  • 二、轮廓的绘制
    • 图像轮廓检测与绘制的代码实现
  • 三、轮廓的近似

一、轮廓的检测

  • 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程
  • 注意:做轮廓检测前需要将图片读取为二值数据,即像素值只为0和255
  • 轮廓检测所用到的函数为 cv2.findcontours(img, mode, method)
  • 参数介绍:
    • image:需要实现轮廓检测的原图
    • mode:轮廓的检索模式,主要有四种方式:
      • CV2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略
      • CV2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级。
      • CV2.RETR_CCOMP: 检索所有的轮廓,并建立一个两级层次结构,其中上面的一层为外边界,里面的一层为内孔的边界轮廓。
      • CV2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。
    • method:轮廓的近似方法,主要有以下两种:
      • CV2.CHAIN_APPROX_NONE:存储所有的轮廓点。
      • CV2.CHAIN_APPROX_SIMPLE:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廊信息。
  • 返回的参数:image,contours,hierarchy
    • image:返回处理的原图(在 OpenCV 4.x 中这个返回值已经被移除)
    • contours:包含图像中所有轮廓的list对象。其中每一个独立的轮廓信息以边界点坐标(x,y)的形式储存在numpy数组中。
    • hierarchy:轮廓的层次结构。一个包含4个值的数组:[Next,Previous,First child,Parent]
      • Next:与当前轮廓处于同一层级的下一条轮廓
      • Previous:与当前轮廓处于同一层级的上一条轮廓
      • First Child:当前轮廓的第一条子轮廓
      • Parent:当前轮廓的父轮廓

二、轮廓的绘制

  • cv2.drawContours()函数是用于在图像上绘制轮廓
  • 参数介绍: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。

图像轮廓检测与绘制的代码实现

import cv2

# 读取图片
phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)  # 转换为灰度图

# 阙值处理为二值(黑白图像)
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
# 查找图像轮廓  cv2.RETR_LIST --> 查找所有轮廓,且不建立等级关系
_, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 查看轮廓的层次结构
print(hierarchy)
# 查看一共有多少的轮廓
print(len(contours))

# 绘制所有的轮廓
Contours_show = cv2.drawContours(phone, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)

# 显示灰度图和在原图中绘出轮廓后的图
cv2.imshow('phone_gray', phone_gray)
cv2.imshow('Contours_show', Contours_show)

# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 结果如下
    在这里插入图片描述

三、轮廓的近似

  • 轮廓的近似是计算机视觉和图像处理中的一个常用技术。它可以帮助我们简化轮廓的形状,去除一些不必要的细节,同时保持轮廓的主要形状特征。

  • 在OpenCV中,可以使用cv2.approxPolyDP()函数来近似一个轮廓。这个函数基于 Douglas-Peucker 算法,该算法通过迭代的方式简化轮廓的顶点集合,以生成一个近似于原始轮廓的多边形,但顶点数量更少。这在处理图像中的形状时非常有用,特别是当你想要去除轮廓上的小噪点或不必要的细节,同时保留其主要形状特征时。

  • 参数解释:cv2.approxPolyDP(curve, epsilon, closed)

    • curve:输入轮廓,通常是一个由点组成的 NumPy 数组,这些点定义了轮廓的形状。
    • epsilon:近似的精度参数。它是原始轮廓到近似多边形之间的最大距离。较小的 epsilon 值意味着近似多边形将更接近原始轮廓,但可能会包含更多的顶点。较大的 epsilon 值会导致生成一个更简单的多边形,但可能会丢失一些细节。
    • closed:一个布尔值,指定近似多边形是否应该是封闭的。如果为 True,则函数将确保近似多边形是封闭的,即第一个和最后一个顶点将相同。
  • 返回值 approx 是一个新的 NumPy 数组,包含了近似多边形的顶点。

  • 代码实现

    import cv2
    
    # 读取图像
    he = cv2.imread('he.png')
    
    # 转换为灰度图像
    he_gray = cv2.cvtColor(he, cv2.COLOR_BGR2GRAY)
    
    # 应用阈值处理
    ret, he_thresh = cv2.threshold(he_gray, 120, 255, cv2.THRESH_BINARY)
    
    # 查找轮廓
    _, contours, hierarchy = cv2.findContours(he_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # 创建一个新图像用于绘制轮廓
    he_new = he.copy()
    
    # 遍历所有轮廓
    for cnt in contours:
        # 轮廓近似
        # cv2.arcLength()函数用于计算轮廓的周长(近似的精度设置为周长的0.2%)
        epsilon = 0.002 * cv2.arcLength(cnt, True)  # 可以调整epsilon的值以获得不同的近似精度
        approx = cv2.approxPolyDP(cnt, epsilon, True)
    
        # 绘制近似后的轮廓
        cv2.drawContours(he_new, [approx], 0, (0, 255, 0), 3)
    
    # 显示原始图像和带有轮廓的图像
    cv2.imshow('Original Image', he)
    cv2.imshow('Image with Contours', he_new)
    
    # 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 结果如下
      在这里插入图片描述
    • 由结果可以看出轮廓的近似结果就是一个近似于原始轮廓的多边行。

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

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

相关文章

探索Python中的Ellipsis:不仅仅是三个点

在Python 3.9中,Ellipsis 对象被赋予了一个新名称,即 ...,这使得它更容易输入和使用。这个变化是在Python 3.9版本中引入的,而不是3.1。这个变化的好处包括: 易用性:使用 ... 比输入 Ellipsis 更快&#xf…

第11讲 回环检测

1、理解回环检测的必要性 2、掌握基于词袋的外观式回环检测 3、通过DBoW3的实验,学习词袋模型的实际用途 1、概述 1.1 回环检测的意义 回环检测模块能够给出除了相邻帧的一些是个更加久远的约束。相机经过了同一个地方,采集了相似的数据。回环检测的关…

OpenCV 之图像平滑处理

引言 图像平滑处理(也称为“模糊处理”)是计算机视觉中一项非常基础的技术,常用于减少图像噪声或失真,提高图像质量。平滑处理可以通过各种滤波器实现,常见的滤波器包括均值滤波、方框滤波、高斯滤波和中值滤波。本文…

【赵渝强老师】大数据生态圈中的组件

大数据体系架构中的组件非常多,每个组件又属于不同的生态圈系统。从最早的Hadoop生态圈体系开始,逐步有了Spark生态圈体系和Flink生态圈体系。因此在学习大数据之前有必要了解一下每一个生态圈体系中具体包含哪些组件,以及它们的作用又是什么…

在移动应用程序中集成模糊方法的基于物联网的天气监测系统的实现

这篇论文的标题是《IMPLEMENTATION OF WEATHER MONITORING SYSTEM BASED INTERNET OF THINGS USING INTEGRATED FUZZY METHOD IN MOBILE APPLICATIONS》,作者是 Muhammad Malik Amin,来自 Politeknik Negeri Jakarta 的 D-IV INSTRUMENTASI DAN KONTROL …

WebAssembly内存结构学习记录

参考: 大文件上传深入研究:https://juejin.cn/post/6870837414852886542 WorkerWasm切片上传:https://juejin.cn/post/7221003401996091429 Wasm实现MD5文件编码:https://juejin.cn/post/7319541565318398003 SharedArrayBuffer与…

Python | 使用Pygments生成漂亮的代码段截图

在创建技术文档或教程时,包含代码段的图像以说明特定的示例或概念可能会有所帮助。但是,对代码文件进行屏幕截图可能看起来不专业,并且难以阅读。本文将探索如何使用库pygments将编程代码转换为Python中美丽的图像片段。 Pygments库 Pygmen…

基于Java+SpringBoot+Vue+MySQL的失物招领管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的失物招领管理系统【附源码文档】、前后…

Java 入门指南:Java 并发编程 —— 并发容器 LinkedBlockingQueue

BlockingQueue BlockingQueue 是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自 Queue 接口。 BlockingQueue 中的元素采用 FIFO 的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作&a…

JavaEE---Spring MVC(4)

MVC学习小案例1 在这里我们要实现一个计算器的功能 在这之前,先解决一个bug! 写好代码之后开始运行,运行发现不对,sum计算不出来,然后我百思不得其解, 1.对着后端代码一顿输出,还是没觉得有问题. 2.对着前端代码一顿输出,也没看出任何问题 3.是不是我前后端交互出错了呢?查找…

Python案例 | 四阶龙格库塔法简介

1.引言 在数值分析中,龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔龙格和马丁威尔海姆库塔于1900年左右发明。 龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高…

工厂验收(FAT)和现场验收(SAT)的含义

工厂验收(Factory Acceptance Test,FAT)和现场验收(Site Acceptance Test,SAT)是在工程领域中常见的术语,用于确保设备在制造商及用户之间达成一致的验收标准,保证设备能够正常、安全…

【图灵完备 Turing Complete】游戏经验攻略分享 Part.2 算术运算

算术运算部分算是开始有难度了。 前几关按照自己思路来,二进制速算应该没问题。 画真值表,卡诺图,推表达式。 下面几关,几个输出信号分开来看,有三个输出就画三个卡诺图,有几个画几个,分而治之。…

Shadow Dom 是什么

概念 官方:https://developer.mozilla.org/zh-CN/docs/Web/API/Web_components/Using_shadow_DOM 核心:影子 DOM(Shadow DOM)允许你将一个 DOM 树附加到一个元素上,并且使该树的内部对于在页面中运行的 JavaScript 和…

Java笔试面试题AI答之正则表达式(3)

文章目录 13. 简述Java String支持哪几种使用正则表达式的方法?14. 请列举常见校验数字的表达式 ?15. 请列举常见校验字符的表达式 ?1. 汉字2. 英文和数字3. 特定长度的字符串4. 由26个英文字母组成的字符串5. 由数字和26个英文字母组成的字符…

JVM面试(五)垃圾回收机制和算法

概述 了解Java虚拟机的垃圾回收机制(Garbage Collection,简称GC),我们也要像其作者John McCarthy一样,思考一下三个问题: 哪些内存需要回收?什么时候回收?如何回收? 虽…

pytorch+深度学习实现图像的神经风格迁移

本文的完整代码和部署教程已上传至本人的GitHub仓库,欢迎各位朋友批评指正! 1.各代码文件详解 1.1 train.py train.py 文件负责训练神经风格迁移模型。 加载内容和风格图片:使用 utils.load_image 函数加载并预处理内容和风格图片。初始化…

网络攻击全解析:主动、被动与钓鱼式攻击的深度剖析

在当今这个互联网高度普及与深度融合的时代,网络攻击,这一赛博空间的隐形威胁,正以前所未有的频率和复杂度挑战着网络安全乃至国家安全的底线。为了更好地理解并防范这些威胁,本文将深入剖析网络攻击的主要类型——主动攻击、被动…

程序设计基础

一、程序 1.什么是程序? 程序可以看作是对一系列动作的执行过程的描述。 计算机程序是指为了得到某种结果而由计算机等具有信息处理能力的装置执行的代码化指令序列。 程序的几个性质: ● 目的性 ● 分步性 ● 有限性 ● 可操作性 ● 有序性 2…

Splasthop 安全远程访问帮助企业对抗 Cobalt Strike 载荷网络攻击

一、背景 根据 FreeBuf(标题为:潜藏系统2个月未被发现,新型网络攻击瞄准中国高价值目标)和 The Hacker News(标题为:New Cyberattack Targets Chinese-Speaking Businesses with Cobalt Strike Payloads&a…