| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> OpenCV中的图像处理 —— 轮廓入门+轮廓特征 -> 正文阅读 |
|
[人工智能]OpenCV中的图像处理 —— 轮廓入门+轮廓特征 |
OpenCV中的图像处理 —— 轮廓入门+轮廓特征目录1. OpenCV中的轮廓1.1 轮廓概述万变不离其宗在学习OpenCV中的轮廓之前,我们先来了解一下什么是轮廓,轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线,轮廓是用于形状分析以及对象及检测和识别的有用工具
想要找到二进制图像的图像,我们需要用到一个函数:cv.findContours(),这个函数中包括三个参数,第一个是原图像,第二个是轮廓检索模式,第三个是轮廓逼近方法,这个函数输出等高线和层次结构,轮廓指的是图像中所有图像的Python列表,每个单独的轮廓是一个(x,y)坐标的Numpy数组的边界点的对象
第二个参数轮廓检索模式的取值可以为:
第三个参数轮廓逼近方法的取值可以为:
资料参考来自文章:【opencv】(6) 图像轮廓处理 1.2 轮廓绘制通过cv.findContours()函数找到轮廓后,我们一般通过cv.drawContours()函数将轮廓绘制出来,只要有边界点,它也可以用来你绘制任何形状,这个函数的第一个参数为图像资源,第二个参数是应该作为Python列表传递的轮廓,第三个参数是轮廓的索引(在绘制单个轮廓时有用,如果需要绘制所有的轮廓,传入参数-1即可),其余的参数是颜色厚度等公共参数
1.3 轮廓近似方法我们前面说到的cv.findContours()函数有三个参数传递,第三个参数是轮廓逼近方法,也就是我们这里要说的轮廓近似方法。轮廓是强度相同的形状的边界,它存储形状边界的(x,y)坐标,但是它也并不是存储所有的坐标 而它存不存储所有的坐标,就取决于轮廓逼近方法的使用,如果我们传入了cv.CHAIN_APPROX_NONE参数,那么轮廓将存储所有的坐标,但是在实际情况中,我们有必要存储所有的坐标吗? 比如我们找到了一个矩形的轮廓,存储所有的坐标会浪费很多空间,我们只存储四个顶点的坐标就可以了,这个操作就是参数cv.CHAIN_APPROX_SIMPLE,这种轮廓逼近方法可以满足我们的需求 2. 轮廓特征2.1 特征矩在学习特征矩之前我们先要了解它的概念,首先特征矩代表了一个轮廓、一幅图像的全局特征,矩信息包含了对应对象不同类型的几何特征,特征矩分为三种:空间矩、中心矩和归一化中心矩
回到我们OpenCV的特征矩,它可以帮助我们计算一些特征,例如质心、面积等,一个重要的函数cv.moments()提供了所有计算出矩值的字典
2.2 轮廓面积 + 周长轮廓区域由函数cv.contourArea()或从矩 M[‘m00’] 中给出 周长也称为弧长,可以使用cv.arcLength()函数找到它。第二个参数指定形状是闭合轮廓( True )还是曲线
2.3 轮廓近似轮廓近似就是根据我们指定的精读,通过道格拉斯-普客算法,将轮廓形状近似为顶点数量较少的其他形状 说到道格拉斯-普客算法,那必须来瞧瞧它的本质:将图像数字化时,对曲线进行采样,即在曲线上取有限个点,将其连接变成折线,并且在一定程度上保持原有的形状
作为前面知识的回顾,我们分析绘制出图像的两个精度不同的近似轮廓的全过程,首先在加载一些我们需要的第三方库,方便我们在代码中使用其方法等,然后在第5行代码我们通过cv,imread()函数读取了一个图像,然后使用了cv.cvtColor()函数将其转化为灰度图,为什么要转化为灰度图呢?因为我们接下来要使用图像阈值!在全局阈值函数cv.threshold()函数中我们要传入的参数有四个,第一个参数是我们的源图像,它一般是灰度图像,这就是为什么要把img变为gray,第二个参数是我们设置的阈值,它用于把图像中的像素做一个分类,大于阈值的像素都将被设置为最大值,第三个参数就是我们设置的最大值,第四个参数是一个表示不同类型的标志 代码到了第8行,从这里开始就要涉及到我们这一部分学到的内容了,首当其冲就是找到轮廓,我们使用了cv.findContours()函数,这个函数的三个参数分别是图像、轮廓检索模式和轮廓逼近方法 到了11行,一个陌生的东西出现了,它就是轮廓近似的核心代码之一,epslion是一个与近似精度密切相关的参数,它表示从轮廓到近似轮廓的最大距离,怎么算这个最大距离呢,那就要用到一个函数了:cv.arcLength(),是不是很眼熟,它就是我们上面说过的求轮廓周长的函数,我们需要选择正确的epsilon才能获得正确的输出
2.4 轮廓凸包轮廓凸包与轮廓近似看起来像,其实一点儿关系没有,关于轮廓凸包我们也有一个重要的函数cv.convexHull()函数,它用来检查曲线是否存在凸凹缺陷并对其进行校正,而校不校正呢,这就由这个函数的参数说了算 一般来说凸曲线一般都是凸出或平坦的曲线,如果在内部凸出了(凹进去了)我们就称其为凸度缺陷,凸度缺陷我们后面再细说 关于函数cv.convexHull()的语法我们摊开说说,它本来长这样:
point是我们传递的轮廓(为什么用的是点(point)呢?是不是忘了轮廓的实质是由具有相同颜色或强度的所有连续点连接起来的曲线),hull(凸出)是输出,我们一般都忽略它,clockwise是方向标记,如果传入True则是顺时针,反之为逆时针,returnPoint默认情况下是True,它返回凸包的坐标,如果为False,则返回与凸包点相对应的轮廓点的索引 然后上例子!(不断实践才能成长!)
文章借鉴来源:OpenCV入门之寻找图像的凸包(convex hull) 2.5 边界矩形(直角矩形+旋转矩形)2.5.1 直角矩形直角矩形不考虑物体的旋转,所以直角边界矩形的面积不是最小的,寻找这个矩形涉及了一个函数:cv.boundingRect()
2.5.2 旋转矩形旋转边界矩形是用最小面积绘制的,所以它考虑了物体的旋转,寻找旋转边界矩形涉及的函数是cv.minAreaRect(),它返回的是一个Box2D结构,其中包含了坐标、宽高和旋转角度,但是我们想要得到这个矩形还是比较麻烦的,我们需要四个顶点的坐标
2.8 最小闭合圆 + 拟合椭圆2.8.1 最小闭合圆查找对象的最小闭合圆需要用到函数:cv.minEnclosingCircle(),它是一个以最小面积完全覆盖物体的圆
2.8.2 拟合椭圆拟合一个对象的椭圆会使用到函数:cv.fitEllipse()
我们来看看应用代码:
(注:文章内容参考OpenCV4.1中文官方文档) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:52:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |