1.轮廓发现

轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。

1.1发现轮廓

在此步骤中我们会使用到findContours这个API,其原型为:

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

注:opencv3会返回三个值,分别是img, countours, hierarchy;

而opencv4中只有 countours, hierarchy两个返回值

第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种:

(1)RETR_EXTERNAL表示只检测外轮廓

(2)RETR_LIST检测的轮廓不建立等级关系

(3)RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息

(4)RETR_TREE建立一个等级树结构的轮廓

其中最常用的是第一种和第四种。

第三个参数method为轮廓的近似办法:

(1)CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

(2)CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

(3)CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

1.2绘制轮廓

在绘制轮廓时我们会用到drawContours该API,其原型为:

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])

第一个参数是指明在哪幅图像上绘制轮廓;

第二个参数是是轮廓本身,在Python中是一个list;

第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓;

之后的参数分别为线的颜色和线宽。

2.操作步骤

1.转换图像为二值化图像:threshold方法或者Canny边缘提取获取的都是二值化图像;

2.通过二值化图像寻找轮廓:findContours;

3.描绘轮廓:drawContours。

2.1阈值法获取轮廓

其代码为:

def conters_demo(image):

dst = cv.GaussianBlur(image, (3, 3), 0) # 图像降噪模糊

gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)# 用大律法、全局自适应阈值方法进行图像二值化

cv.imshow("binary_image", binary)

contours, heriachy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # RETR_TREE检测内部

# contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # RETR_EXTERNAL检测外部轮廓

for i, contour in enumerate(contours):

cv.drawContours(image, contours, i, (0, 0, 255), 2) # 绘制轮廓

# cv.drawContours(image, contours, i, (0, 0, 255), -1) # 填充轮廓

print(i)

cv.imshow("detect_contours", image)

原图为:

经过二值化后:

绘制其轮廓后:

2.2使用Canny边缘检测获取轮廓

代码为:

def edge_demo(image):

blur = cv.GaussianBlur(image, (3, 3), 0) # 降低噪声

gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)

# x方向的梯度

xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)

# y方向的梯度

ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)

# 求出图像的边缘

edge_output = cv.Canny(xgrad, ygrad, 50, 150)

cv.imshow("Canny_Edge", edge_output)

return edge_output

def conters_demo(image):

binary = edge_demo(image)

contours, heriachy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # RETR_TREE检测内部

# contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # RETR_EXTERNAL检测外部轮廓

for i, contour in enumerate(contours):

cv.drawContours(image, contours, i, (0, 0, 255), 2) # 绘制轮廓

# cv.drawContours(image, contours, i, (0, 0, 255), -1) # 填充轮廓

print(i)

cv.imshow("detect_contours", image)

Canny边缘检测后的结果为:

绘制其轮廓为:

完整代码

import cv2 as cv # 导入opencv模块

import numpy as np # 导入数学函数库

def edge_demo(image):

blur = cv.GaussianBlur(image, (3, 3), 0) # 降低噪声

gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)

# x方向的梯度

xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)

# y方向的梯度

ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)

# 求出图像的边缘

edge_output = cv.Canny(xgrad, ygrad, 50, 150)

cv.imshow("Canny_Edge", edge_output)

return edge_output

def conters_demo(image):

""""""

dst = cv.GaussianBlur(image, (3, 3), 0) # 图像降噪模糊

gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)# 用大律法、全局自适应阈值方法进行图像二值化

cv.imshow("binary_image", binary)

# binary = edge_demo(image)

contours, heriachy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # RETR_TREE检测内部

# contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # RETR_EXTERNAL检测外部轮廓

for i, contour in enumerate(contours):

cv.drawContours(image, contours, i, (0, 0, 255), 2) # 绘制轮廓

# cv.drawContours(image, contours, i, (0, 0, 255), -1) # 填充轮廓

print(i)

cv.imshow("detect_contours", image)

print("------------hello python!------------")

src = cv.imread("D:/opencv3/image/huafen.jpg")

cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)

cv.imshow("input_image", src)

conters_demo(src)

cv.waitKey(0)

cv.destroyAllWindows() # 释放所有窗口

python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv相关推荐

  1. Opencv——查找并绘制凸包、凸包与轮廓的关系

    定义 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型. 理解物体形状或轮廓的一 种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects). 检测 ...

  2. python编程教程第九讲_Python入门学习视频,最全面讲解视频无偿分享,这些基础知识你都懂了吗?...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  3. python读取文件数据恢复软件_python深度学习pdf恢复

    3步快速找回,让数据恢复变得简单 版权所有 1990-2020 B计划信息技术有限公司 python深度学习pdf python深度学习pdf Windows 10,Windows 7,Windows ...

  4. python中字符串查找子串_Python字符串中查找子串的方法

    Python字符串中查找子串的方法 发布于 2015-04-12 08:58:32 | 230 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对象.解释型计 ...

  5. Python+Django+LeanCloud+腾讯云函数学习记录(第一周学习记录)

    第一周学习记录 开始从事微信小程序云开发和后台搭建的实习工作,这半年来会一直定期更新学习记录 1.微信爬虫模块 1.Itchat包 ​ 使用itchat包的初衷是为了通过该包的login端口直接通过扫 ...

  6. python简单目标检测代码_Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全 ...

  7. python opencv 读取图片_Python opencv 读取图像

    对于 matlab 起家做数字图像处理的人来讲都非常适应matlab对图像处理的操作和思路,尤其是它可以非常方便直观的看到图像的RGB值. 由于最近在研究深度学习的计算机视觉方面的东西,于是完全自学接 ...

  8. python人脸识别门禁_Python+Opencv+Tkinter指纹识别与人脸识别的门禁兼考勤(一)

    一.设计目标:旨在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统.该系统同时具备普通用户模式.管理员模式与超级管理员模式,下面具体介绍每种模式下的功能. 1)普通用户模式 该模式可分为收集 ...

  9. python裁剪图片边缘模糊_Python OpenCV 图片高斯模糊

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. 基础知识铺垫 看到一种说法,解释高斯模糊的比较简单,高斯模糊是带加权的均值模糊. 大概解释如下: 高斯模糊实质上就是一种均 ...

最新文章

  1. Linux运维跳槽必备的40道面试精华题
  2. 5G NGC — UDR 统一数据存储库,UDSF 非结构化数据存储功能
  3. 杂谈人工智能说大数据
  4. windows安装 Chocolatey
  5. 统计MySQL中某数据库硬盘占用量大小
  6. linux里的run-level,linux run level 为何物
  7. 【云栖大会】业务和安全的融合实践详解
  8. 无任何网络提供程序接受指定的网络路径
  9. 转:从内部开始 认识Oracle数据库结构组件
  10. wordpress后台出现404
  11. 小新pro13 archlinux 显卡 声卡 驱动安装
  12. Hibernate中类的继承联合使用subclass和join
  13. 高精度定位网络PAS的经济模式_RTK基站网络共享奖励模式
  14. 【Linux】Linux文件权限的理解
  15. Android车机初体验
  16. 在国企的日子(第三章中部 出差)
  17. IDEA上连接MYSQL数据库
  18. 4G IoT设备开发,一板搞定
  19. opencv2.4.13在win10+VS2015下的配置过程
  20. APP自动化测试---adb常用命令+monkey自动化

热门文章

  1. 给正在努力的您几条建议(附开源代码)
  2. 迁移数据库到SQL on Linux Docker
  3. html选择文本框后提示消失,两种方法实现文本框输入内容提示消失
  4. h5外卖源码php_校园食堂外卖APP走红 更多APP定制开发上一品威客网
  5. 【ArcGIS微课1000例】0013:ArcGIS创建色带图例(以GlobeLand30土地覆盖数据为例)
  6. 子窗体菜单合并到父窗体菜单的解决办法
  7. Android之设置当前app为默认浏览器研究
  8. Kotlin之?和!!最简单的理解
  9. java之ThreadLocal简单使用总结
  10. Bit Manipulation —— 位运算