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 03 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
浅谈Python peewee 使用经验
Oct 20 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
python操作redis方法总结
Jun 06 Python
Python实战之制作天气查询软件
May 14 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
python opencv调用笔记本摄像头
Aug 28 Python
Python中使用gflags实例及原理解析
Dec 13 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 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
实用函数5
2007/11/08 PHP
C# Assembly类访问程序集信息
2009/06/13 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
BootStrap modal实现拖拽功能
2018/12/01 Javascript
图解javascript作用域链
2019/05/27 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
python中偏函数partial用法实例分析
2015/07/08 Python
Python正则简单实例分析
2017/03/21 Python
Python生成随机密码的方法
2017/06/16 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
PHP实现两种排课方式
2021/06/26 PHP