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基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
python实现图书管理系统
Mar 12 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
解决seaborn在pycharm中绘图不出图的问题
May 24 Python
python tkinter窗口最大化的实现
Jul 15 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
python正则表达式实例代码
Mar 03 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
基于Python爬取素材网站音频文件
Oct 21 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
Python数据分析入门之数据读取与存储
May 13 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记录日志的实现代码
2011/08/08 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
DOM中事件处理概览与原理的全面解析
2016/08/16 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
vue学习笔记之Vue中css动画原理简单示例
2020/02/29 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
《Python学习手册》学习总结
2018/01/17 Python
Python入门之后再看点什么好?
2018/03/05 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
Python 实现PS滤镜中的径向模糊特效
2020/12/03 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
趣味比赛活动方案
2014/02/15 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
数学教师个人工作总结
2015/02/06 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
航班延误投诉信
2015/07/02 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
Django框架模板用法详解
2022/06/10 Python