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生成器实现微线程编程的教程
Apr 13 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
python实现数独算法实例
Jun 09 Python
python书籍信息爬虫实例
Mar 19 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
Python实现的求解最小公倍数算法示例
May 03 Python
Django框架的使用教程路由请求响应的方法
Jul 03 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
Python 实现Mac 屏幕截图详解
Oct 05 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
生成缩略图
2006/10/09 PHP
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
动态生成gif格式的图像要注意?
2006/10/09 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
JS点击缩略图整屏居中放大图片效果
2017/07/04 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
override和overload的区别
2016/03/09 面试题
环保倡议书300字
2014/05/15 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
刑事辩护词范文
2015/05/21 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
httpclient调用远程接口的方法
2022/08/14 Java/Android