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程序设计入门(1)基本语法简介
Jun 13 Python
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
浅谈python类属性的访问、设置和删除方法
Jul 25 Python
python executemany的使用及注意事项
Mar 13 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
flask框架视图函数用法示例
Jul 19 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
python 批量压缩图片的脚本
Jun 02 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
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
layer弹出层扩展主题的方法
2019/09/11 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
python中学习K-Means和图片压缩
2017/11/20 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
Python argparse模块应用实例解析
2019/11/15 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
一句话工作感言
2014/03/01 职场文书
监察建议书范文
2014/03/12 职场文书
移风易俗倡议书
2014/04/15 职场文书
员工考核评语大全
2014/04/26 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
护士医德医风自我评价
2014/09/15 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
python必学知识之文件操作(建议收藏)
2021/05/30 Python