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远程桌面协议RDPY安装使用介绍
Apr 15 Python
python中的字典使用分享
Jul 31 Python
Python如何实现守护进程的方法示例
Feb 08 Python
django站点管理详解
Dec 12 Python
python跳出双层for循环的解决方法
Jun 24 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
Python bisect模块原理及常见实例
Jun 17 Python
小结Python的反射机制
Sep 28 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 Python
方法汇总:Python 安装第三方库常用
Apr 26 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/25 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
Document 对象的常用方法
2009/07/31 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
JS实现简单日历特效
2020/01/03 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
python检测服务器端口代码实例
2019/08/31 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
opencv 阈值分割的具体使用
2020/07/08 Python
Python实现EM算法实例代码
2020/10/04 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
智能钱包:Ekster
2019/11/21 全球购物
机械电子工程毕业生自荐信
2013/11/23 职场文书
岗位职责说明书
2014/05/07 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
出国导师推荐信
2015/03/25 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript