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并发2之使用asyncio处理并发
Dec 21 Python
Python实现的生成格雷码功能示例
Jan 24 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
Python3 assert断言实现原理解析
Mar 02 Python
Python自省及反射原理实例详解
Jul 06 Python
golang中的空接口使用详解
Mar 30 Python
Python采集股票数据并制作可视化柱状图
Apr 04 Python
一行Python命令实现批量加水印
Apr 07 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和XSL stylesheets转换XML文档
2006/10/09 PHP
php中去除所有js,html,css代码
2010/10/12 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php中socket通信机制实例详解
2015/01/03 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
Python3实现生成随机密码的方法
2014/08/23 Python
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
Python去除字符串两端空格的方法
2015/05/21 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
Django数据库迁移常见使用方法
2020/11/12 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
逃课打麻将检讨书
2014/10/05 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
MySQL七大JOIN的具体使用
2022/02/28 MySQL