Python+OpenCV图像处理——实现轮廓发现


Posted in Python onOctober 23, 2020

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

代码如下:

import cv2 as cv
import numpy as np
def contours_demo(image):
  dst = cv.GaussianBlur(image, (3, 3), 0) #高斯模糊去噪
  gray = cv.cvtColor(dst, cv.COLOR_RGB2GRAY)
  ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #用大律法、全局自适应阈值方法进行图像二值化
  cv.imshow("binary image", binary)
  cloneTmage, contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
  for i, contour in enumerate(contours):
    cv.drawContours(image, contours, i, (0, 0, 255), 2)
    print(i)
  cv.imshow("contours", image)
  for i, contour in enumerate(contours):
    cv.drawContours(image, contours, i, (0, 0, 255), -1)
  cv.imshow("pcontours", image)
src = cv.imread('E:/imageload/coins.jpg')
cv.namedWindow('input_image', cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow('input_image', src)
contours_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

Python+OpenCV图像处理——实现轮廓发现

注意:

1.Opencv发现轮廓的函数原型为:findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy

image参数表示8位单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。

mode参数表示轮廓检索模式:

①CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略。

②CV_RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓。

③CV_RETR_CCOMP:检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。

④CV_RETR_TREE:检测所有轮廓,所有轮廓建立一个等级树结构,外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

method参数表示轮廓的近似方法:

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

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

③CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。

contours参数是一个list,表示存储的每个轮廓的点集合。

hierarchy参数是一个list,list中元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

offset参数表示每个轮廓点移动的可选偏移量。

2.Opencv绘制轮廓的函数原型为:drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) -> image

imgae参数表示目标图像。

contours参数表示所有输入轮廓。

contourIdx参数表示绘制轮廓list中的哪条轮廓, 如果是负数,则绘制所有轮廓。

color参数表示轮廓的颜色。

thickness参数表示绘制的轮廓线条粗细,如果是负数,则绘制轮廓内部。

lineType参数表示线型。

hierarchy参数表示有关层次结构的可选信息。

maxLevel参数表示绘制轮廓的最大级别。 如果为0,则仅绘制指定的轮廓。 如果为1,则该函数绘制轮廓和所有嵌套轮廓。 如果为2,则该函数绘制轮廓,所有嵌套轮廓,所有嵌套到嵌套的轮廓,等等。 仅当有可用的层次结构时才考虑此参数。

offset参数表示可选的轮廓偏移参数,该参数可按指定的方式移动所有绘制的轮廓。

以上就是Python+OpenCV图像处理——实现轮廓发现的详细内容,更多关于python 轮廓发现的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
推荐11个实用Python库
Jan 23 Python
Python中强大的命令行库click入门教程
Dec 26 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
Python基于滑动平均思想实现缺失数据填充的方法
Feb 21 Python
基于Python打造账号共享浏览器功能
May 30 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
一文搞懂如何实现Go 超时控制
Mar 30 Python
python 带时区的日期格式化操作
Oct 23 #Python
Python可视化工具如何实现动态图表
Oct 23 #Python
python 匿名函数与三元运算学习笔记
Oct 23 #Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 #Python
Python+OpenCV图像处理——实现直线检测
Oct 23 #Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 #Python
Python 列表推导式需要注意的地方
Oct 23 #Python
You might like
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
php共享内存段示例分享
2014/01/20 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
python PIL模块与随机生成中文验证码
2016/02/27 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
python实现顺序表的简单代码
2018/09/28 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
python re的findall和finditer的区别详解
2020/11/15 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
J2EE中常用的名词进行解释
2015/11/09 面试题
网络工程专业毕业生推荐信
2013/10/28 职场文书
汽车销售顾问求职自荐信
2014/01/01 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
2016年教代会开幕词
2016/03/04 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
OpenCV 图像梯度的实现方法
2021/07/25 Python