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通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
python中zip和unzip数据的方法
May 27 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
python爬取网易云音乐评论
Nov 16 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
python制作抖音代码舞
Apr 07 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
Python基础之pandas数据合并
Apr 27 Python
利用Python实现翻译HTML中的文本字符串
Jun 21 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
PHPMailer发送邮件
2016/12/28 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
axios基本入门用法教程
2017/03/25 Javascript
js实现移动端轮播图效果
2020/12/09 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
朴素贝叶斯算法的python实现方法
2014/11/18 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
python中partial()基础用法说明
2018/12/30 Python
浅析python的Lambda表达式
2019/02/27 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
被告答辩状范文
2015/05/22 职场文书
篮球拉拉队口号
2015/12/25 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers