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从入门到精通(DAY 1)
Dec 20 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
python实现学生成绩测评系统
Jun 22 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
python 牛顿法实现逻辑回归(Logistic Regression)
Oct 15 Python
Python3+Appium安装及Appium模拟微信登录方法详解
Feb 16 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
改造一台复古桌面收音机
2021/03/02 无线电
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
django实现用户注册实例讲解
2019/10/30 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
商场消防管理制度
2014/01/12 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
档案接收函格式
2015/01/30 职场文书
法制工作总结2015
2015/07/23 职场文书