| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【opencv-python】轮廓操作 -> 正文阅读 |
|
[人工智能]【opencv-python】轮廓操作 |
参考资料学习目标
什么是轮廓轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或灰度。轮廓是形状分析和对象检测和识别的有用工具。为了获得更好的准确性,使用二值图像。所以在找到轮廓之前,应该用阈值或Canny边缘检测算法先进行预处理。自OpenCV 3.2以后,findContours()不再对源图像进行修改。在应用中,查找轮廓就像从黑色背景中查找查找白色目标物体,所以在使用轮廓查找功能时,目标物体需要是白色的而背景需要是黑色的,这就是为什么要对二值图像进行预处理。下面我们看看如何在二值图像中查找轮廓。下面展示如何在二值图像中提取轮廓的代码:
函数中由三个参数,第一是源图像,第二个是轮廓恢复模式,第三个是轮廓近似方法。函数输出轮廓和层级。输出轮廓的结果是包含图像中所有轮廓的一个Python列表。每个独立的轮廓是一个表现为(x,y)目标边界点坐标形式的Numpy数组。示例代码的功能基本上可以覆盖其他所有轮廓的提取任务。 如何绘制轮廓画轮廓用cv.drawContours()函数。这个函数也可以用于任意形状且有边界点的轮廓。函数第一个参数是源图像,第二个参数是以Python列表形式传送的轮廓,第三个参数是轮廓的索引(如果画某个图像中单独的轮廓,这个选项就是有用的;如果先把图像中所有轮廓都画出来,这个参数就输入-1),其他剩余参数是轮廓颜色、厚度等等。
轮廓近似方法轮廓近似方法选项就是cv.findContours()函数的第三个参数,那么这个参数实际意味着什么呢?前文所述,轮廓的本质就是具有相同灰度的轮廓形状,以形状边界的(x,y)点坐标形式存储。但是其是否存储所有的坐标,有这个轮廓近似方法确定。如果选“cv.CHAIN_APPROX_NONE”选项,所有的边界点都会储存,但是实际上不需要所有的边界点。例如,如果发现直线的轮廓,我们是否需要轮廓上全部的点去表示这条线?当然是不需要的,我只需要知道直线的两个端点就可以了,这些就可以用“cv.CHAIN_APPROX_SIMPLE”搞定,其可以移除冗余点并将轮廓压缩从而节省内存。下文的矩形图像阐释了这个技术,我们在轮廓阵列的所有坐标点上用蓝色绘制圆形,首先在第一张图像中展示用“cv.CHAIN_APPROX_NONE”(734个点)处理的轮廓,第二章图像显示用“cv.CHAIN_APPROX_SIMPlE”(只有四个点)提取的轮廓,由此可见这种操作节省了多少内存。 轮廓特征主要涉及如何找到不同轮廓的特征,如面积、周长、边界框等等,与轮廓相关的功能还是非常多的。图像的moments能够辅助计算诸如目标质心、面积之类的特征,想要详细了解可以查阅维基百科相关页面。函数cv.moments()提供一个包含所有计算得到moment值得字典,参考如下代码:
矩(MOMENTS)从这个moments可以算出很多特征,如area、centroid。其中质心可以通过如下公式算出:
轮廓面积轮廓面积由函数cv.contourArea()或矩M[‘m00’]给出,代码如下:
轮廓周长它也被称为弧长。可以使用cv.arcLength()函数实现功能。第二个参数指定形状是闭合轮廓(如果传递为True),还是仅为曲线。
轮廓近似根据我们指定的精度,基于Douglas Peucker算法将一个轮廓形状近似为另一个顶点数较少的形状。为了理解这一点,假设试图在图像中找到一个正方形,但是由于图像中的一些问题没有得到一个完美的正方形,而是一个“坏形状”(如下面的第一幅图像所示),则可以使用此函数来近似形状。在这里,第二个参数称为ε,它是从轮廓到近似轮廓的最大距离,是一个表示精度参数。要获得正确的输出,需要正确地选择ε。
在下图的第二幅图中,绿线显示了ε=0.1倍弧长的近似曲线。第三幅图显示了epsilon=弧长的1%的情况。第三个参数指定曲线是否闭合。 凸包凸包看起来类似于轮廓近似,但事实并非如此(在某些情况下,两者可能提供相同的结果)。在这里,cv.convexHull()函数检查曲线的凸度缺陷并对其进行纠正。一般来说,凸曲线是指总是凸出的曲线,或者至少是平坦的曲线。如果内部凸起,则称为凸面缺陷。例如,检查下面的手的图像。红线显示手的凸面外壳。双面箭头标记显示凸面缺陷,即包与轮廓的局部最大偏差。
函数参数细节说明如下:
因此为了得到形如上述图像的凸包,下列事项是非常重要的:
但如果要查找凸性缺陷,则需要传递returnPoints=False。为了理解它,我们将使用上面的矩形图像。首先我发现它的轮廓是cnt。现在我发现它的凸包返回点=True,我得到以下值:[[234 202]],[[51 202]],[[51 79]],[[234 79]]],它们是矩形的四个角点。现在,如果对returnPoints=False执行相同的操作,我将得到以下结果:[[129]、[67]、[0]、[142]]。这些是轮廓线中对应点的索引值。例如,检查第一个值:cnt[129]=[[234, 202]],该值与第一个结果相同(其他值也是如此)。简单的说,如果returnPoints为True,就直接返回点,否则就返回点的索引值。当后面讨论凸性缺陷时,将再次看到这些内容。 凸性检测cv.isContourConvex()函数可以检查曲线是否凸,它只返回正确或错误。
边框有两种类型的边界矩形。
直边矩形(绿色)和旋转矩形(红色)都在下面的图中展示出来了。 最小外接圆我们使用函数cv.MineConclosingCircle()查找对象的外接圆,即一个以最小面积完全覆盖物体的圆。代码如下:
拟合椭圆将对象轮廓拟合为一个椭圆,并返回椭圆能内接的旋转矩形,代码如下:
效果如下图所示: 拟合直线近似地,可以针对一组点拟合一条直线,下图包含了一组白色的点,可以将它们近似逼近为一条直线,代码如下:
运行效果如下图所示: 轮廓性质此处我们获取目标轮廓的一些常用属性,如坚固度、等效直径、遮罩图像、平均灰度等。更多功能可在Matlab regionprops文档中找到。质心、面积、周长等也属于轮廓性质这一类,但是这些内容已经在前文提及了。 纵横比(Aspect Ratio )目标边界矩形的宽度与高度之比。
限度(Extent)限度(Extent)就是轮廓面积和边框矩形的比值,用公式表示如下: E x t e n t = O b j e c t A r e a B o u n d i n g R e c t a n g l e A r e a Extent=\frac{Object Area}{Bounding Rectangle Area} Extent=BoundingRectangleAreaObjectArea? 示例代码如下:
坚固度(Solidity)坚固度是轮廓面积和凸包面积之比
等效直径(Equivalent Diameter)等效直径就是通过轮廓面积计算出来的圆直径。
方向(Orientation)方向就是目标指向的角度,下面显示的函数也能给出长轴和短轴长度。
掩膜和像素点(Mask and Pixel Points)在某些情况下,我们需要包含目标的所有像素点,可以通过下列代码实现:
这里给出了两种方法,一种使用Numpy函数,另一种使用OpenCV函数(最后一行注释)来实现同样的功能。结果也一样,但略有不同。Numpy以**(行、列)格式给出坐标,而OpenCV以(x、y)**格式给出坐标。所以基本上答案会互换。请注意,行=y,列=x。 最大/最小值和相应位置(Maximum Value, Minimum Value and their locations )我们可以使用掩膜图像计算出这些参数:
平均颜色和平均灰度可以找到目标的平均颜色,或者得到在灰度模式下的平均灰度,这些还可以通过相同的掩膜方法实现:
极值点极值点是指目标的最上面、最下面、最右边和最左边的点。
这是个印度的地图,得到下列结果: 其它更多函数学习目标
理论和相关代码凸性缺陷之前已经熟悉了什么事凸包,目标与凸包之间的偏差可以视为凸性缺陷。OpenCV中的函数cv.convexityDefects()可以实现这个功能,示例代码如下:
寻找凸包的时候,要设置returnPoints = False以便找到凸性缺陷。返回值是一个数组,形如[ start point, end point, farthest point, approximate distance to farthest point ]. 同时可以使用图像对其进行可视化,通过一条连接首末点,然后在最远点画个圆,前三个返回值是轮廓的索引,因此需要从cnt中读取到这些值,示例代码如下所示:
运行结果如下图所示: 感谢支持,欢迎关注,丰富技术/学术内容持续更新! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/27 10:41:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |