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 相关文章推荐
python3实现读取chrome浏览器cookie
Jun 19 Python
python thrift搭建服务端和客户端测试程序
Jan 17 Python
wxpython实现图书管理系统
Mar 12 Python
基于Django与ajax之间的json传输方法
May 29 Python
python写入文件自动换行问题的方法
Jul 05 Python
django表单的Widgets使用详解
Jul 22 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python分别打包出32位和64位应用程序
Feb 18 Python
python实现贪吃蛇游戏源码
Mar 21 Python
利用Python如何实时检测自身内存占用
May 09 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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 使用html5实现多文件上传实例
2016/10/24 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
JavaScript 模拟用户单击事件
2009/12/31 Javascript
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
详细介绍Python的鸭子类型
2016/09/12 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
Python实现元素等待代码实例
2019/11/11 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
大学生物业管理求职信
2013/10/24 职场文书
园艺师求职信
2014/04/27 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
会计工作总结范文2014
2014/12/23 职场文书
人才市场接收函
2015/01/30 职场文书
社区重阳节活动总结
2015/03/24 职场文书
交通事故代理词范文
2015/05/23 职场文书
python异常中else的实例用法
2021/06/15 Python