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异步回调机制实现和使用方法
Nov 26 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
python实现决策树分类(2)
Aug 30 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Keras之自定义损失(loss)函数用法说明
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实现的MongoDB数据库操作类分享
2014/05/12 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
Jquery ajax书写方法代码实例解析
2020/06/12 jQuery
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
Python Scapy随心所欲研究TCP协议栈
2018/11/20 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
Python简单基础小程序的实例代码
2019/04/28 Python
详解numpy的argmax的具体使用
2019/05/27 Python
python实现QQ批量登录功能
2019/06/19 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
"火柴棍式"程序员面试题
2014/03/16 面试题
先进员工事迹材料
2014/12/20 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
Python利用folium实现地图可视化
2021/05/23 Python
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android