python 基于opencv 绘制图像轮廓


Posted in Python onDecember 11, 2020

图像轮廓概念

轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。
谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手;而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓。

python 基于opencv 绘制图像轮廓

寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图。

注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一个框。

opencv找出图像轮廓

使用cv.findContours()寻找轮廓:

import cv2 as cv
import numpy as np

img = cv.imread('j.png')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

# 寻找二值图像的轮廓
contours, hierarchy = cv.findContours(
  thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

print(len(contours))
  • 参数2:轮廓的查找方式,一般使用cv.RETR_TREE,表示提取所有的轮廓并建立轮廓间的层级。
  • 参数3:轮廓的近似方法。比如对于一条直线,我们可以存储该直线的所有像素点,也可以只存储起点和终点。使用cv.CHAIN_APPROX_SIMPLE就表示用尽可能少的像素点表示轮廓。
  • 简便起见,这两个参数也可以直接用真值3和2表示。
  • 函数有2个返回值,hierarchy是轮廓间的层级关系,这个不用理会。我们主要看contours,它就是找到的轮廓了,以链表形式存储,记录了每条轮廓的所有像素点的坐标(x,y)。

python 基于opencv 绘制图像轮廓

opencv绘制图像轮廓

轮廓找出来后,可以像图中那样用红色画出来:cv.drawContours()

cv.drawContours(img, contours, -1, (0, 0, 255), 2)
其中参数2就是得到的contours,参数3表示要绘制哪一条轮廓,-1表示绘制所有轮廓,参数4是颜色(B/G/R通道,所以(0,0,255)表示红色),参数5是线宽。

经验之谈:很多人画图时明明用了彩色,但没有效果,请检查你是在哪个图上画,画在灰度图和二值图上显然是没有彩色的。

一般情况下,我们会首先获得要操作的轮廓,再进行轮廓绘制及分析:
cnt = contours[1]
cv.drawContours(img, [cnt], 0, (0, 0, 255), 2)

实验:找出并绘制图像轮廓

import cv2 as cv
import numpy as np

img = cv.imread('jiao.jpg')
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)

# 寻找二值图像的轮廓
contours, hierarchy = cv.findContours(
  thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cnt = contours[1:6]

cv.drawContours(img, cnt, -1, (0, 0, 255), 2)

cv.imshow('result',img)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果

python 基于opencv 绘制图像轮廓

以上就是python 基于opencv 绘制图像轮廓的详细内容,更多关于python 绘制图像轮廓的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python的构建工具setup.py的方法使用示例
Oct 23 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
python使用matplotlib绘制热图
Nov 07 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
Python3之手动创建迭代器的实例代码
May 22 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
Pycharm激活方法及详细教程(详细且实用)
May 12 Python
如何利用python实现列表嵌套字典取值
Jun 10 Python
python通过cython加密代码
Dec 11 #Python
python 对象真假值的实例(哪些视为False)
Dec 11 #Python
Python排序函数的使用方法详解
Dec 11 #Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 #Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 #Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 #Python
基于Python中Remove函数的用法讨论
Dec 11 #Python
You might like
php auth_http类库进行身份效验
2009/03/19 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
使用python实现kNN分类算法
2019/10/16 Python
Django 框架模型操作入门教程
2019/11/05 Python
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
小学教师听课制度
2014/02/01 职场文书
国培远程培训感言
2014/03/08 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
大学生实训报告总结
2014/11/05 职场文书
2015年工程师工作总结
2015/04/30 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
小学运动会前导词
2015/07/20 职场文书
校园广播稿范文
2015/08/19 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
Python如何把不同类型数据的json序列化
2021/04/30 Python
MySQL修炼之联结与集合浅析
2021/10/05 MySQL