1 长宽比 边界矩形的宽高比 x,y,w,h = cv2.boundingRect(cnt) aspect_ratio = float(w)/h 2 Extent 轮廓面积与边界矩形面积的比 area contourArea(cnt) x,y,w,h = cv2.boundingRect(cnt) rect_area = w*h extent = float(area)/rect_area 3 Solidity 轮廓面积与凸包面积的比 convexHull(cnt) hull_area = cv2.contourArea(hull) solidity = float(area)/hull_area 4 Equivalent Diameter 与轮廓面积相等的圆形的直径 旋转角度 6 掩模和像素点 有时我们需要构成对象的所有像素点,我们可以这样做 mask = np.zeros(imgray.shape,np.uint8) # 这里一定要使用参数-1, 绘制填充的的轮廓 minMaxLoc(imgray,mask = mask) 8 平均颜色及平均灰度 我们也可以使用相同的掩模求一个对象的平均颜色或平均灰度 mean_val = cv2.mean(im,mask = mask) 9
轮廓是一个形状具有相同灰度值的边界。 它会存贮形状边界上所有的 (x,y) 坐标。 但是需要将所有的这些边界点都存储吗? 这就是 cv2.CHAIN_APPROX_SIMPLE 要做的 它会将轮廓上的冗余点都去掉,压缩轮廓,从而节省内存开支 使用 cv2.CHAIN_APPROX_SIMPLE 的结果,一般只有 4 个点
按照这种方式分类,一幅图像中的所有轮廓之间就建立父子关系。 这样我们就可以确定一个轮廓与其他轮廓是怎样连接的, 比如它是不是某个轮廓的子轮廓,或者是父轮廓。 我们把它当成轮廓 2 的子轮廓。它就成为(组织结构)第 1 级。 同样轮廓 3 是轮廓 2 的子轮廓,成为(组织结构)第 3 级。 最后轮廓 4,5 是轮廓 3a 的子轮廓,成为(组织结构)4 级(最后一级)。 按照这种方式 给这些形状编号, 我们可以说轮廓 4 是轮廓 3a 的子轮廓(当然轮廓 5 也是)。 没有必要再解释了,轮廓 2 的子轮廓为 2a。 所以它的 First_Child 为 2a。 那轮廓 3a 呢?它有两个子轮廓。 轮廓 4 和 5 的父轮廓是轮廓 3a。
函数 cv2.minEnclosingCircle() 可以帮我们找到一个对象的外切圆。 它是所有能够包括对象的圆中面积最小的一个
1 凸包 凸包与轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。 函数 cv2.convexHull() 可以用来检测一个曲线是否具有凸性缺陷,并能纠 正缺陷。 hull = cv2.convexHull(points[, hull[, clockwise[, returnPoints]] 参数: • points 我们要传入的轮廓 • hull 输出, 如果设置 为 False,就会返回与凸包点对应的轮廓上的点 一般使用,下面的语句就够了 hull = cv2.convexHull(cnt) 但是如果你想获得凸性缺陷,需要把 returnPoints 以上面的矩形为例,首先我们找到他的轮廓 cnt。 现在把 returnPoints 设置为 False,我得到的结果是 [[129],[ 67],[ 0],[142]] 他们是轮廓点的索引。
cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) 2 轮廓面积 轮廓的面积可以使用函数 cv2.contourArea() 计算得到, 这个函数 的第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲线) perimeter = cv2.arcLength(cnt,True) 4 轮廓近似 将轮廓形状近似到另外一种由更少点组成的轮廓形状 ,新轮廓的点的数目 由我们设定的准确度来决定。 这个函数的第二个参数叫 epsilon,它是从原始轮廓到近似轮廓的最大距离。 它是一个准确度参数。 , 第三幅 图是当 epsilon = 1% 时得到的近似轮廓。
我们将起点和终点用一条绿线 连接,在最远点画一个圆圈, 要记住的是返回结果的前三个值是轮廓点的索引。 所以我们还要到轮廓点中去找它们 import cv2 import numpy as np img = cv2.imread('star.jpg') img_gray = cv2.cvtColor(img 2 Point Polygon Test 求解图像中的一个点到一个对象轮廓的最短距离。如果点在轮廓的外部, 返回值为负。如果在轮廓上,返回值为 0。如果在轮廓内部,返回值为正。 如果是 False,只会判断这个点与轮廓之间的位置关系(返回值为 +1,-1,0) 注意:如果你不需要知道具体距离,建议你将第三个参数设为 False, 这样速 度会提高 2 到 3 倍 3 形状匹配 函数 cv2.matchShape() 可以帮我们比较两个形状或轮廓的相似度。
1 什么是轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。 轮廓在形状分析和物体的检测和识别中很有用 –为了更加准确,要使用二值化图像。 –在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测 –查找轮廓的函数会修改原始图像 –如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量中 –在 OpenCV 有三个参数 –第一个是输入图像 –第二个是轮廓检索模式 –第三个是轮廓近似方法 返回值有三个 –第一个是图像 –第二个 是轮廓 –第三个是(轮廓的)层析结构 轮廓(第二个返回值)是一个 Python 列表,其中存储这图像中的所有轮廓 每一个轮廓都是一个 Numpy 数组,包含对象边界点(x,y)的坐标 2 怎样绘制轮廓 函数 cv2.drawContours() 可以被用来绘制轮廓 –第三个参数是轮廓的索引(在绘制独立轮廓是很有用,当设置为-1时绘制所有轮廓)。
虽然Canny.之类的边缘检测算法可以根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体进行处理。下一步是要将这些边缘像素合成轮廓。 轮廓层次 在了解到底如何提取轮廓之前,有必要花一些时间来理解轮廓到底是什么以及一组轮廓之间如何互相关联。 图中有五块颜色区域(分别标记为A,B,C,D,E), 每块区域的外部边界和内部边界都各自组成轮廓。因此共有9条轮廓。每条轮廓都由一组输出列表表示(右上角图一轮廓参数)。 # 轮廓近似法 contours[, # 检测到的轮廓。 如果为 1,则函数绘制轮廓和所有嵌套轮廓。 如果为 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套的轮廓,依此类推。仅当存在可用层次结构时才考虑此参数。
当分析一张图像的时候,针对轮廓,我们也许有很多事情要做。毕竟,所有轮廓都是或即将是我们想要进行识别或操作的。另外相关的还有多种对轮廓的处理,如描述轮廓,简化或拟合轮廓,匹配轮廓到模板,等等。 本文记录 OpenCV 中的轮廓分析的相关操作。 多边形逼近 当我们绘制一个多边形或进行形状分析时,通常需要使用多边形逼近一个轮廓,使顶点数变少。 Douglas-Peucker(DP) 逼近算法 该算法首先从轮廓(图B)中挑出两个最远的点,将两点相连(图C)。然后在原来的轮廓上寻找一个离线段距离最远的点, 将该点加入逼近后的新轮廓中。 从这里可以看出,将该精度设置为轮廓周长或外包矩形周长等表示轮廓总长度的值的几分之一比较合适。 这可能包括长度或其他一些反应轮廓整体大小的量度。另一个有用的特性是轮廓矩(contour moment)可以用来概括轮廓的总形状特性,这部分我们在下一节讨论。
标的1:电网管理平台(资产域V2.0)建设项目 预算 29299.2 万元 (1)标包1:电网管理平台(资产域V2.0-安全监管、系统运行)建设项目,预算 3588.49 万元 本项目依托南方电网公司云平台 (2)标包2:电网管理平台(资产域V2.0-电网规划、基建管理等)建设项目,预算 8493.55 万元 本项目依托南方电网公司云平台、全域物联网平台、人工智能平台、南网智瞰服务、项目中心、数据中心等技术平台 (3)标包3:电网管理平台(资产域V2.0-输变电管理、配网透明化管理、防灾减灾应用)建设项目,预算 6239.45 万元 本项目依托南方电网公司云平台、全域物联网平台、人工智能平台、南网智瞰服务、项目中心 (2)标包2:文件转换迁移系统和OFD版式阅读软件采购,预算 90 万元 采购文件转换迁移系统一套,采购OFD版式阅读软件系统一套。 建设单位:公司总部。 标的9:2022年南网智瞰运营实施项目 预算 1300.73 万元 围绕南网智瞰平台建立运营组织体系,开展运营支撑、用户分析推广、需求分析管理、活动运营策划、分子公司辅助运营、数据制作等常态化运营工作。
一个跟轮廓相关的最常用到的功能是如何匹配多条轮廓。我们或许需要比较两条计算好的轮廓,或者比较一条轮廓和一个抽象模板。这两种情况都会在本文讨论。 矩 相关介绍 比较两条轮廓最简洁的方法之一是比较它们的轮廓矩。轮廓矩代表了一条轮廓、一幅图像、一组点集的某些高级特征。下面的所有讨论对轮廓、图像、点集都同样适用,简便起见,将它们统称为对象。 当处理轮廓时,结果是轮廓的长度。 将m_{10}和m_{01}相加再除以mo,能得到整个对象的平均x值和y值。 cv2.moments 计算多边形或光栅化形状的所有矩,最高可达三阶。 官方文档 仅适用于来自 Python 绑定的轮廓矩计算: 注意,输入数组的 numpy 类型应该是 np.int32或 np.float32。 官方文档 函数使用 cv2.matchShapes( contour1, # 第一个轮廓或灰度图像。 contour2, # 第二轮廓或灰度图像。
在OpenCV中,轮廓检测和轮廓筛选是图像处理中常用的技术,用于识别和分析图像中物体的形状。以下是详细的分步说明: 一、轮廓检测(Contour Detection) 1. 调用cv2.findContours()检测轮廓 该函数返回轮廓的坐标点和层级关系。 cv2.CHAIN_APPROX_NONE:保留所有轮廓点。 二、轮廓筛选(Contour Filtering) 1. 基于面积筛选 过滤掉面积过小或过大的轮廓。 层级结构处理 场景:需区分嵌套轮廓(如字母“O”的内外轮廓)。 医学图像分析:分割细胞或器官轮廓。 机器人导航:识别障碍物边界。 通过灵活组合轮廓特征(面积、形状、凸性等),可以高效筛选出符合需求的轮廓,为后续处理提供基础。
#将灰度图片转换为二值图片 contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#计算图像轮廓 面积= 9571.0 contours[5]面积= 9281.5 contours[6]面积= 8.5 contours[7]面积= 14.0 contours[8]面积= 36.0 contours[9] 4.0 contours[16]面积= 3263.0 contours[17]面积= 9103.5 contours[18]面积= 6578.5 contours[19]面积= 8974.5 算法:轮廓面积是估算图像轮廓部分和起始点连线构成的封闭部分的像素数量 retval=cv2.contourArea(contour[, oriented])) contour表示图像轮廓 oriented表示布尔型值,如果为True,则返回值包含正/负号,表示轮廓是顺时针还是逆时针 ,默认值是False,表示返回retval是绝对值 注意:轮廓面积的单位是像素。
#将灰度图片转换为二值图片 contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#计算图像轮廓 mask",mask) cv2.waitKey() cv2.destroyAllWindows() pixelpoints.shape= (9129, 1, 2) pixelpoints= [[ 9 217] [ 9 218] [ 9 219] [115 225] [115 226] [115 227]] 算法:实心轮廓是通过获取特定对象的掩模图像及其对应的像素点位置信息来获取实心轮廓,应用在图像噪声消除等领域。 函数cv2.drawContours()的轮廓宽度参数thickness设置不为-1,即获取图像的空心轮廓。
#将灰度图片转换为二值图片 contours,hierarchy=cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#计算图像轮廓 imshow("mask",mask) cv2.waitKey() cv2.destroyAllWindows() pixelpoints.shape= (1158, 2) pixelpoints= [[ 9 217] [ 9 218] [ 9 219] [115 225] [115 226] [115 227]] 算法:空心轮廓是通过获取特定对象的掩模图像及其对应的像素点位置信息来获取空心轮廓,应用在图像噪声消除等领域。 函数cv2.drawContours()的轮廓宽度参数thickness设置为-1,即获取图像的实心轮廓。
https://github.com/zuruoke/watermark-removal 9 Kwrt 给喜欢折腾智能家居和路由的同学,推荐一个 OpenWrt 配置工具:supes.top。 性能,友好度,易用性,插件,以及针对国内特殊环境等的自定义优化, 开箱即用 https://github.com/kiddin9/Kwrt --完--
外部的轮廓为父轮廓,内部的轮廓为子轮廓,按照上述关系分类,一幅图像中所有轮廓之间就建立了父子关系。 ) image表示输入图像 mode表示图像轮廓的检索模式 method表示图像轮廓的近似方法 image=cv2.drawContours(image, contours, contourIdx, 表示绘制轮廓边缘 color表示绘制颜色 thickness表示画笔粗细,可选参数 lineType表示绘制线型,可选参数 hierarchy表示图像轮廓的层次信息 maxLevel表示图像轮廓的层次深度 offset表示偏移参数 例子: 绘制所有轮廓: cv.drawContours(img, contours, -1, (0, 255, 0), 3) 绘制单个轮廓: cv.drawContours( 3) 注意:轮廓就像从黑色背景中找到白色物体,通常情况下,预先对图像进行阈值分割或边缘检测得到二值图像。
目标 了解轮廓概念 寻找并绘制轮廓 OpenCV函数:cv2.findContours(), cv2.drawContours() 教程 啥叫轮廓 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。 谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。 经验之谈:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一个框。 ,一般使用cv2.RETR_TREE,表示提取所有的轮廓并建立轮廓间的层级。 to clipboardErrorCopied 小结 轮廓特征非常有用,使用cv2.findContours()寻找轮廓,cv2.drawContours()绘制轮廓。
threshold(gray,235,255,cv2.THRESH_BINARY)#将灰度图片转换为二值图片 contours,hierarchy=cv2.findContours(thresh,2,1)#计算图像轮廓 (轮廓)的最短距离(垂线距离),又称点和多边形的关系测试。 ,表示计算点到轮廓的距离。 如果点在轮廓的外部,返回值为负数;如果点在轮廓上,返回值为0;如果点在轮廓内部,返回值为正数。如果为False,不表示计算距离,表示点相对于轮廓的位置关系,返回值为-1、0和1。 如果点在轮廓的外部,返回值为-1;如果点在轮廓上,返回值为0;如果点在轮廓内部,返回值为1