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人人网登录应用实例
Sep 26 Python
从Python程序中访问Java类的简单示例
Apr 20 Python
详解Python的Lambda函数与排序
Oct 25 Python
python正则分析nginx的访问日志
Jan 17 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
对django views中 request, response的常用操作详解
Jul 17 Python
python tkinter实现屏保程序
Jul 30 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
小结Python的反射机制
Sep 28 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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
学习php中的正则表达式
2014/08/17 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
JS完成代码前最好对其做5件事
2013/04/07 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
Vue.js用法详解
2017/11/13 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
招商经理岗位职责
2013/11/16 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书