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格式化输出%s和%d
May 07 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
python中使用zip函数出现错误的原因
Sep 28 Python
利用python开发app实战的方法
Jul 09 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
使用pandas读取文件的实现
Jul 31 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
python如何保存文本文件
Jun 07 Python
python实现批处理文件
Jul 28 Python
Python常用模块函数代码汇总解析
Aug 31 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
python实现A*寻路算法
Jun 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中的字符串函数
2006/11/24 PHP
说明的比较细的php 正则学习实例
2008/07/30 PHP
php计算整个目录大小的方法
2015/06/19 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
原生js开发的日历插件
2017/02/04 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
关于layui flow loading占位图的实现方法
2019/09/21 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
Python编程中的文件操作攻略
2015/10/16 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
会计毕业生求职简历的自我评价
2013/10/20 职场文书
晚宴邀请函范文
2014/01/15 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
入党政审材料范文
2014/12/24 职场文书
城管年度个人总结
2015/02/28 职场文书
台风停课通知
2015/04/24 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
PHP 时间处理类Carbon
2022/05/20 PHP