• 售前

  • 售后

热门帖子
入门百科

Python OpenCV 基于图像边缘提取的轮廓发现函数

[复制链接]
第一个甲马俳 显示全部楼层 发表于 2021-10-26 12:59:37 |阅读模式 打印 上一主题 下一主题
底子知识铺垫

在图像中,表面可以简朴的明确为毗连具有相同颜色的所有一连点(边界)的曲线,表面可用于形状分析和对象检测、识别等领域。
表面发现的原理:先通过阈值分割提取目标物体,再通过边沿检测提取目标物体表面。
一个表面就是一系列的点(像素),这些点构成了一个有序的点集合。
使用
  1. cv2.findContours
复制代码
函数可以用来检测图像的边沿。
函数原型说明
  1. contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
复制代码
我使用的 Python OpenCV 是 4.0 以上版本,如果你使用的是 3.0 以上,大概存在返回值差别问题。
参数说明如下:
      
    1. image
    复制代码
    :输入图像;  
    1. mode
    复制代码
    :表面检索模式,详细说明参见后文;  
    1. method
    复制代码
    :表面逼近方法,详细说明加入后文;  
    1. contours
    复制代码
    :返回的表面;  
    1. hierachy
    复制代码
    :每条表面临应的属性;  
    1. offset
    复制代码
    :每个表面点移动的可选偏移量。
备注:
  1. image
复制代码
参数需要是二值图,而不是灰度图,返回效果是等高线和条理布局。
表面检索模式,有四种
      
    1. cv2.RETR_EXTERNAL
    复制代码
    :表现只检测外表面;  
    1. cv2.RETR_LIST
    复制代码
    :检测的表面,不创建品级关系;  
    1. cv2.RETR_CCOMP
    复制代码
    :创建两个品级的表面,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内另有一个连通物体,这个物体的边界也在顶层;  
    1. cv2.RETR_TREE
    复制代码
    :创建一个品级树布局的表面。上述内容,都可以在该网站查询:官网地址
表面逼近方法
      
    1. cv2.CHAIN_APPROX_NONE
    复制代码
    :存储所有的表面点,相邻的两个点的像素位置差不超过 1,即
    1. max(abs(x1-x2),abs(y2-y1))==1
    复制代码
    ,一样寻常不会用到;  
    1. cv2.CHAIN_APPROX_SIMPLE
    复制代码
    :压缩水平方向,垂直方向,对角线方向的元素,只保存该方向的终点坐标,比方一个矩形表面只需 4 个点来保存表面信息。  
    1. cv2.CHAIN_APPROX_TC89_L1
    复制代码
    1. cv2.CV_CHAIN_APPROX_TC89_KCOS
    复制代码
    :使用
    1. teh-Chinl chain
    复制代码
    近似算法(没寻找资料学习)。
了解上述内容之后,就可以应用表面发现函数了,代码如下:
  1. import cv2 as cv
  2. src = cv.imread("./both.jpeg")
  3. gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
  4. ret, thresh = cv.threshold(gray, 150, 255, 0)
  5. cv.imshow("thresh",thresh)
  6. # 寻找轮廓
  7. contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
复制代码
表面发现之后,还要通过
  1. cv2.drawContours
复制代码
函数绘制表面,该函数原型如下:
  1. image = cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
复制代码
参数说明如下:
      
    1. image
    复制代码
    :输入图像;  
    1. contours
    复制代码
    :表面,在 Python 中是一个 list,就是
    1. cv2.findContours
    复制代码
    函数找出来的点集,一个列表;  
    1. contourIdx
    复制代码
    :表面的索引,指定绘制表面 list 中的哪条表面,要绘制所有表面,请传递-1;
    1. color
    复制代码
    :颜色;  
    1. thickness
    复制代码
    :厚度,如果是-1,表现添补;  
    1. lineType
    复制代码
    :线型;  
    1. hierarchy
    复制代码
    :条理布局的可选信息;  
    1. maxLevel
    复制代码
    :绘制表面的最大级别,0:仅绘制指定的表面,1:绘制表面和所有嵌套表面,2:绘制表面,所有嵌套表面,所有嵌套到嵌套的表面;  
    1. offset
    复制代码
    :表面偏移参数。
测试代码与运行效果如下:
  1. import cv2 as cv
  2. # help(cv.drawContours)
  3. src = cv.imread("./both.jpeg")
  4. gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
  5. ret, thresh = cv.threshold(gray, 150, 255, 0)
  6. cv.imshow("thresh",thresh)
  7. # 寻找轮廓
  8. contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
  9. # print(contours)
  10. # print(hierarchy)
  11. # 绘制轮廓
  12. cv.drawContours(src,contours,-1,(200,0,150),2)
  13. cv.imshow('src',src)
  14. cv.waitKey(0)
复制代码

到此这篇关于Python OpenCV 基于图像边沿提取的表面发现函数的文章就先容到这了,更多干系OpenCV 边沿提取表面 内容请搜索脚本之家以前的文章或继续欣赏下面的干系文章盼望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作