这篇教程Python OpenCV 基于图像边缘提取的轮廓发现函数写得很实用,希望能帮到您。 基础知识铺垫在图像中,轮廓可以简单的理解为连接具有相同颜色的所有连续点(边界)的曲线,轮廓可用于形状分析和对象检测、识别等领域。 轮廓发现的原理:先通过阈值分割提取目标物体,再通过边缘检测提取目标物体轮廓。 一个轮廓就是一系列的点(像素),这些点构成了一个有序的点集合。 使用 cv2.findContours 函数可以用来检测图像的边缘。 函数原型说明contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) 我使用的 Python OpenCV 是 4.0 以上版本,如果你使用的是 3.0 以上,可能存在返回值差异问题。 参数说明如下: image :输入图像; mode :轮廓检索模式,具体说明参见后文; method :轮廓逼近方法,具体说明参加后文; contours :返回的轮廓; hierachy :每条轮廓对应的属性; offset :每个轮廓点移动的可选偏移量。 备注:image 参数需要是二值图,而不是灰度图,返回结果是等高线和层次结构。 轮廓检索模式,有四种 cv2.RETR_EXTERNAL :表示只检测外轮廓; cv2.RETR_LIST :检测的轮廓,不建立等级关系; cv2.RETR_CCOMP :建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层; cv2.RETR_TREE :建立一个等级树结构的轮廓。上述内容,都可以在该网站查询:官网地址 轮廓逼近方法 cv2.CHAIN_APPROX_NONE :存储所有的轮廓点,相邻的两个点的像素位置差不超过 1,即 max(abs(x1-x2),abs(y2-y1))==1 ,一般不会用到; cv2.CHAIN_APPROX_SIMPLE :压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需 4 个点来保存轮廓信息。 cv2.CHAIN_APPROX_TC89_L1 ,cv2.CV_CHAIN_APPROX_TC89_KCOS :使用 teh-Chinl chain 近似算法(没寻找资料学习)。 了解上述内容之后,就可以应用轮廓发现函数了,代码如下: import cv2 as cvsrc = cv.imread("./both.jpeg")gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 150, 255, 0)cv.imshow("thresh",thresh)# 寻找轮廓contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) 轮廓发现之后,还要通过 cv2.drawContours 函数绘制轮廓,该函数原型如下: image = cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) 参数说明如下: image :输入图像; contours :轮廓,在 Python 中是一个 list,就是 cv2.findContours 函数找出来的点集,一个列表; contourIdx :轮廓的索引,指定绘制轮廓 list 中的哪条轮廓,要绘制所有轮廓,请传递-1;color :颜色; thickness :厚度,如果是-1,表示填充; lineType :线型; hierarchy :层次结构的可选信息; maxLevel :绘制轮廓的最大级别,0:仅绘制指定的轮廓,1:绘制轮廓和所有嵌套轮廓,2:绘制轮廓,所有嵌套轮廓,所有嵌套到嵌套的轮廓; offset :轮廓偏移参数。 测试代码与运行结果如下: import cv2 as cv# help(cv.drawContours)src = cv.imread("./both.jpeg")gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 150, 255, 0)cv.imshow("thresh",thresh)# 寻找轮廓contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)# print(contours)# print(hierarchy)# 绘制轮廓cv.drawContours(src,contours,-1,(200,0,150),2)cv.imshow('src',src)cv.waitKey(0) 
到此这篇关于Python OpenCV 基于图像边缘提取的轮廓发现函数的文章就介绍到这了,更多相关OpenCV 边缘提取轮廓 内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! Python解析JSON对象的全过程记录 anaconda jupyter不能导入安装的lightgbm解决方案 |