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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python中的生成器和yield详细介绍
Jan 09 Python
python3使用urllib模块制作网络爬虫
Apr 08 Python
如何用itertools解决无序排列组合的问题
May 18 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
python3 拼接字符串的7种方法
Sep 12 Python
Python中@property的理解和使用示例
Jun 11 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
python获取Linux发行版名称
Aug 30 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
python requests.get带header
May 05 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 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 项目的方法
2007/01/02 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
python中偏函数partial用法实例分析
2015/07/08 Python
利用python求相邻数的方法示例
2017/08/18 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
曼城官方网上商店:Manchester City
2019/09/10 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
中医学专业自荐信范文
2014/04/01 职场文书
德育标兵事迹材料
2014/08/24 职场文书
公司周年庆活动方案
2014/08/25 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
主持人大赛开场白
2015/05/29 职场文书
海底两万里读书笔记
2015/06/26 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP