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中的进程、线程、协程
Mar 18 Python
Python学习笔记之解析json的方法分析
Apr 21 Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python使用pydub库对mp3与wav格式进行互转的方法
Jan 10 Python
Django ORM 查询管理器源码解析
Aug 05 Python
Python 经典算法100及解析(小结)
Sep 13 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
python绘图subplots函数使用模板的示例代码
Apr 30 Python
python识别围棋定位棋盘位置
Jul 26 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
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js跳转页面方法总结
2014/01/29 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Python网络编程详解
2017/10/31 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
护士自我鉴定范文
2013/10/06 职场文书
自我评价如何写好?
2014/01/05 职场文书
承诺书样本
2014/08/30 职场文书
2015中学学校工作总结
2015/07/20 职场文书
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL