Python Opencv实现图像轮廓识别功能


Posted in Python onMarch 23, 2020

本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下

要求:用矩形或者圆形框住图片中的云朵(不要求全部框出)

Python Opencv实现图像轮廓识别功能

轮廓检测

Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。

import cv2

img = cv2.imread('cloud.jpg')
# 灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY)
img1, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 以圆形框出云朵
# for i in range(len(contours)):
# (x, y), radius = cv2.minEnclosingCircle(contours[i])
# center = (int(x), int(y))
# radius = int(radius)
# img = cv2.circle(img, center, radius, (0, 255, 0), 2)

#以云朵边界轮廓框出云朵
cv2.drawContours(img, contours, -1, (0, 0, 255), 3)

cv2.imshow("img", img)
cv2.waitKey(0)

Python Opencv实现图像轮廓识别功能

需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。

cv2.findContours()函数

函数的原型为:

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

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

参数说明

第一个参数是寻找轮廓的图像
第二个参数表示轮廓的检索模式,有四种:
1. cv2.RETR_EXTERNAL表示只检测外轮廓
2. cv2.RETR_LIST检测的轮廓不建立等级关系
3. cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
4. cv2.RETR_TREE建立一个等级树结构的轮廓。
第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,
即max(abs(x1−x2),abs(y2−y1))==1max(abs(x1−x2),abs(y2−y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

返回值

cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。

contour返回值

cv2.findContours()函数首先返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。这个概念非常重要。在下面drawContours中会看见。可以打印观察contours的数据类型。

print (type(contours)) 
print (type(contours[0])) 
print (len(contours))

hierarchy返回值

该函数还可返回一个可选的hiararchy结果,这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

Python Opencv实现图像轮廓识别功能

轮廓的绘制

OpenCV中通过cv2.drawContours在图像上绘制轮廓。

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

第一个参数是指明在哪幅图像上绘制轮廓;
第二个参数是轮廓本身,在Python中是一个list;
第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。
后面的参数很简单。其中thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。

Python Opencv实现图像轮廓识别功能

OpenCV中通过cv2.minEnclosingCircle()可以帮我们找到一个对象的外接圆。它是所有能够包括对象的圆中面积最小的一个。

(x,y),radius = cv2.minEnclosingCircle(contours[i])
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)

Python Opencv实现图像轮廓识别功能

本文已被收录到专题《python图片处理操作》 ,欢迎大家点击学习更多精彩内容。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(四):域名系统
Jun 09 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
python安装requests库的实例代码
Jun 25 Python
django url到views参数传递的实例
Jul 19 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
pytorch 实现查看网络中的参数
Jan 06 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
Python代码执行时间测量模块timeit用法解析
Jul 01 Python
python 贪心算法的实现
Sep 18 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
python opencv实现图像边缘检测
Apr 29 #Python
Python Django给admin添加Action的方法实例详解
Apr 29 #Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 #Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 #Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 #Python
详解【python】str与json类型转换
Apr 29 #Python
python实现给微信指定好友定时发送消息
Apr 29 #Python
You might like
Protoss兵种介绍
2020/03/14 星际争霸
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
php之static静态属性与静态方法实例分析
2015/07/30 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
用JS写的一个TableView控件代码
2010/01/23 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
详细介绍Ruby中的正则表达式
2015/04/10 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
自我评价范文
2013/12/22 职场文书
暑期实践思想汇报
2014/01/06 职场文书
公司中秋节活动方案
2014/02/12 职场文书
初中教师业务学习材料
2014/05/12 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
教师节寄语2015
2015/03/23 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
java如何实现socket连接方法封装
2021/09/25 Java/Android
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python