Python+OpenCV图像处理——实现轮廓发现


Posted in Python onOctober 23, 2020

简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。

代码如下:

import cv2 as cv
import numpy as np
def contours_demo(image):
  dst = cv.GaussianBlur(image, (3, 3), 0) #高斯模糊去噪
  gray = cv.cvtColor(dst, cv.COLOR_RGB2GRAY)
  ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #用大律法、全局自适应阈值方法进行图像二值化
  cv.imshow("binary image", binary)
  cloneTmage, contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
  for i, contour in enumerate(contours):
    cv.drawContours(image, contours, i, (0, 0, 255), 2)
    print(i)
  cv.imshow("contours", image)
  for i, contour in enumerate(contours):
    cv.drawContours(image, contours, i, (0, 0, 255), -1)
  cv.imshow("pcontours", image)
src = cv.imread('E:/imageload/coins.jpg')
cv.namedWindow('input_image', cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放
cv.imshow('input_image', src)
contours_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

Python+OpenCV图像处理——实现轮廓发现

注意:

1.Opencv发现轮廓的函数原型为:findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy

image参数表示8位单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。

mode参数表示轮廓检索模式:

①CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略。

②CV_RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓。

③CV_RETR_CCOMP:检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。

④CV_RETR_TREE:检测所有轮廓,所有轮廓建立一个等级树结构,外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

method参数表示轮廓的近似方法:

①CV_CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max (abs (x1 - x2), abs(y2 - y1) == 1。

②CV_CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。

③CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。

contours参数是一个list,表示存储的每个轮廓的点集合。

hierarchy参数是一个list,list中元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

offset参数表示每个轮廓点移动的可选偏移量。

2.Opencv绘制轮廓的函数原型为:drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) -> image

imgae参数表示目标图像。

contours参数表示所有输入轮廓。

contourIdx参数表示绘制轮廓list中的哪条轮廓, 如果是负数,则绘制所有轮廓。

color参数表示轮廓的颜色。

thickness参数表示绘制的轮廓线条粗细,如果是负数,则绘制轮廓内部。

lineType参数表示线型。

hierarchy参数表示有关层次结构的可选信息。

maxLevel参数表示绘制轮廓的最大级别。 如果为0,则仅绘制指定的轮廓。 如果为1,则该函数绘制轮廓和所有嵌套轮廓。 如果为2,则该函数绘制轮廓,所有嵌套轮廓,所有嵌套到嵌套的轮廓,等等。 仅当有可用的层次结构时才考虑此参数。

offset参数表示可选的轮廓偏移参数,该参数可按指定的方式移动所有绘制的轮廓。

以上就是Python+OpenCV图像处理——实现轮廓发现的详细内容,更多关于python 轮廓发现的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中sets模块的用法实例
Sep 30 Python
Python中用format函数格式化字符串的用法
Apr 08 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
python xml解析实例详解
Nov 14 Python
Python的时间模块datetime详解
Apr 17 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
Python pip install之SSL异常处理操作
Sep 03 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
python​格式化字符串
Apr 20 Python
python 带时区的日期格式化操作
Oct 23 #Python
Python可视化工具如何实现动态图表
Oct 23 #Python
python 匿名函数与三元运算学习笔记
Oct 23 #Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 #Python
Python+OpenCV图像处理——实现直线检测
Oct 23 #Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 #Python
Python 列表推导式需要注意的地方
Oct 23 #Python
You might like
php实现webservice实例
2014/11/06 PHP
php 浮点数比较方法详解
2017/05/05 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
JS实现放大镜效果
2020/09/21 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
基于javascript实现放大镜特效
2020/12/03 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
python中partial()基础用法说明
2018/12/30 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
手术室护士自我鉴定
2013/10/14 职场文书
道德演讲稿
2014/05/21 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
2014年质检工作总结
2014/11/26 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
教师远程培训心得体会
2016/01/09 职场文书
2019各种保证书范文
2019/06/24 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书