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的Django框架使用的一些实用建议
Apr 03 Python
低版本中Python除法运算小技巧
Apr 05 Python
python传递参数方式小结
Apr 17 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
Python 常用 PEP8 编码规范详解
Jan 22 Python
python实现扫描日志关键字的示例
Apr 28 Python
Python获取网段内ping通IP的方法
Jan 31 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 Python
Python基于gevent实现文件字符串查找器
Aug 11 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
ajax php 实现写入数据库
2009/09/02 PHP
PHP数组实例总结与说明
2011/08/23 PHP
php Session存储到Redis的方法
2013/11/04 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
php实现将Session写入数据库
2015/07/26 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
Python使用re模块实现信息筛选的方法
2018/04/29 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
内业资料员岗位职责
2014/01/04 职场文书
如何写你的创业计划书
2014/01/07 职场文书
水果超市创业计划书
2014/01/27 职场文书
写字楼租赁意向书
2014/07/30 职场文书
新农村建设汇报材料
2014/08/15 职场文书
教师自我剖析材料
2014/09/29 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
财务人员入职担保书
2015/09/22 职场文书
2015团员个人年度总结
2015/11/24 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers