Opencv基于Python图像轮廓

您所在的位置:网站首页 怎么给图像轮廓描边 Opencv基于Python图像轮廓

Opencv基于Python图像轮廓

2024-01-16 15:47| 来源: 网络整理| 查看: 265

轮廓入门 目标 1. 轮廓入门 1.1 什么是轮廓 1. 2 如何绘制轮廓 1.3 轮廓近似方法 2. 轮廓特征 2.1 特征矩 2.2 轮廓面积 2.3 轮廓周长 2.4 轮廓近似 2.5 轮廓凸包 2.6 检查凸度 2.7 边界矩形 2.7.1 直边外接矩形 2.7.2 旋转矩形(最小外接矩形) 2.8 最小外接圆 2.9 椭圆拟合 2.10 直线拟合 3. 结语

目标

在本篇文章中,我们将学习到以下内容:

了解轮廓是什么 学习查找轮廓,绘制轮廓等 轮廓入门部分你将学到以下函数:cv.findContours(),cv.drawContours() 如何找到轮廓的不同特征,例如面积,周长,质心,边界框等 轮廓特征部分你将学习到大量与轮廓有关的功能 1. 轮廓入门 1.1 什么是轮廓

轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线,轮廓是用于形状分析以及对象检测和识别的有用工具。

为了获得更高的准确性,请使用二进制图像。因此,在找到轮廓之前,请应用阈值或canny边缘检测。 从OpenCV 3.2开始,findContours()不再修改原图像。 在OpenCV中,找到轮廓就像从黑色背景中找到白色物体。因此请记住,一般需要找到的对象应该是白色,背景应该是黑色。

下面让我们看看如何找到二进制图像的轮廓:

代码1.1:

import numpy as np import cv2 as cv # 读取图像 img = cv.imread('./data/test.png') # 灰度化 imggray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 二值化 ret, thresh = cv.threshold(imggray, 127, 255, 0) # 轮廓提取 img2, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # 第三个参数传递值为-1,绘制所有轮廓 cv.drawContours(img, contours, -1, (0, 255, 0), 3) # cv.drawContours(img, contours, 3, (0, 255, 0), 3) # cnt = contours[3] # cv.drawContours(img, [cnt], 0, (0, 255, 0), 3) # 显示轮廓 cv.namedWindow('drawContours', 0) cv.imshow('drawContours', img) cv.waitKey()

findcontour()函数中有三个参数,第一个是原图像,第二个是轮廓检索模式,第三个是轮廓逼近方法,输出等高线和层次结构。轮廓是图像中所有轮廓的Python列表,每个单独的轮廓是一个(x,y)坐标的Numpy数组的边界点的对象。

效果如下图所示: 绘制所有轮廓

绘制所有轮廓

注意: 接下来我们将详细讨论第二和第三个参数以及有关层次的结构,在此之前,代码示例中赋予它们的值将适用于所有图像。

1. 2 如何绘制轮廓

要绘制轮廓,请使用cv.drawContours函数。只要有边界点,它也可以用来绘制任何形状,它的第一个参数是原图像,第二个参数是应该作为Python列表传递的轮廓,第三个参数是轮廓的索引(在绘制单个轮廓时有用,要绘制所有轮廓,请传递-1),其余参数是颜色,宽度等等。

在图像中绘制所有轮廓: cv.drawContours(img, contours, -1, (0,255,0), 3) 绘制单个轮廓,如第四个轮廓,仅需修改上述第13行代码参数即可: cv.drawContours(img, contours, 3, (0,255,0), 3)

效果如下图所示: 第四条轮廓

绘制第四条轮廓 但是在大多数情况下,以下方法会很有用: cnt = contours[3] cv.drawContours(img, [cnt], 0, (0,255,0), 3)

注意: 最后两种方法相似,但是学习到后面时,你会发现最后一种更有用。

1.3 轮廓近似方法

这是cv.findContours函数中的第三个参数。它实际上表示什么?

上面我们说的是轮廓强度相同形状的边界,它存储形状边界的(x,y)坐标,但是它存储所有坐标吗?其实它是通过轮廓近似方法指定的。

如果传递cv.CHAIN_APPROX_NONE,则将存储所有边界点,但是实际上我们需要所有这些点吗?例如,你找到了一条直线的轮廓。你是否需要线上的所有点来代表该线?不,我们只需要该线的两个端点即可。这就是cv.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。

下面的矩形图像演示了此技术,只需在轮廓数组中的所有坐标上绘制一个环(以绿色绘制),第一幅图像显示了我用cv.CHAIN_APPROX_NONE获得的效果(734个点),第二幅图像显示了我用cv.CHAIN_APPROX_SIMPLE获得的效果(只有4个点)。可以看到,它可以节省大量内存!!! 矩形 四点

2. 轮廓特征

在本章节部分,我们将学习以下内容:

如何找到轮廓的不同特征,例如面积,周长,质心,边界框等 实现大量与轮廓有关的功能 2.1 特征矩

特征矩可以帮助计算一些特征,例如物体的质心,物体的面积等,函数cv.moments()提供了所有计算出的矩值的字典。此时,你可以提取有用的数据,例如面积,质心等。

质心由关系给出, C x = M 10 M 00 和 C y = M 01 M 00 C_x = \frac{M_{10}}{M_{00}} 和 C_y = \frac{M_{01}}{M_{00}} Cx​=



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3