OpenCV-python学习笔记(六)——梯度算子,边缘检测和轮廓提取
文章目录
- gradients and edge detection梯度和边缘检测
- 1 laplacian拉普拉斯算子
- 2 sobel算子
- 3 canny edge detector边缘探测
- contours轮廓
- 1 counting coins数硬币
- 2 crop coins裁切提取硬币
gradients and edge detection梯度和边缘检测
边缘检测,就是用数学方法找出一幅图像中像素值突变的点。
第一件事,就是找出灰度图像中的梯度,在x方向和y方向中找出可能有边缘的区域。
接着我们会使用canny边缘检测,包括图像降噪,找到图像梯度(利用在水平和竖直方向上的sobel核),非最大值抑制non-maximum suppresion,和滞后阈值hysteresis thresholding。
1 laplacian拉普拉斯算子
# 注意从黑向白映射是一个正的斜坡函数,但从白向黑映射是一个负的斜坡函数
# 所以需要用cv2.CV_64F这种格式
lap = cv2.Laplacian(image, cv2.CV_64F)
lap = cp.uint8(np.absolute(lap))
cv2.imshow("Laplacian", lap)
2 sobel算子
# 水平梯度
sobelX = cv2.Sobel(image, cv2.CV_64F, 1, 0)
sobelX = np.uint8(np.absolute(sobelX))
cv2.imshow("Sobel X", sobelX)
# 垂直梯度
sobelY = cv2.Sobel(image, cv2.CV_64F, 0, 1)
sobelY = np.uint8(np.absolute(sobelY))
cv2.imshow("Sobel Y", sobelY)
# 结合x和y两个方向的梯度
sobelCombined = cv2.bitwise_or(sobelX,sobelY)
cv2.imshow("Sobel Combined", sobelCombined)
3 canny edge detector边缘探测
canny边缘探测是一个多步骤的过程,涉及到滤波降噪,计算sobel在两个方向上的梯度,边缘抑制suppressing edeges,和滞后阈值hysteresis thresholding,最终决定一个像素是否像是个边缘。
# 所有的梯度和边缘探测算子都需要转换成灰度图
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 仅canny需要使用模糊
image = cv2.GaussianBlur(image, (5,5), 0)
# 使用canny算子
# 第一个阈值表示低于30的梯度将不会被判定成边缘
# 第二个阈值表示超过150的梯度才会被判定成边缘
canny = cv2.Canny(image, 30, 150)
contours轮廓
轮廓是一条曲线上的点,并且这条曲线没有间断。
怎样找到图像的轮廓呢,首先要获得二值化图像,无论是使用边缘检测还是二值化。接下来是一个使用canny边缘检测算子来找出硬币的轮廓,然后找到实际硬币的轮廓的例子。
1 counting coins数硬币
# 基础处理,二值化,模糊,探测边缘
gray = cv2.cvtColor()
blurred = cv2.GaussianBlur()
edged = cv2.Canny(blurred, 30, 150)
cv2.imshow("Edges", edged)# 第二个参数表示返回外围最大轮廓,如果使用cv2.RETR_LIST可以返回所有轮廓
# 第三个参数表示分层架构,还可以使用cv2.RETR_COMP和cv2.RETR_TREE
(_, cnts, _) = cv2.findCoutours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print("{} coins in this image".format(len(cnts)))coins = image.copy()
# 参数分别表示画布,轮廓,轮廓序号(-1代表全部),颜色,线条宽度
cv2.drawCountours(coins, cnts, -1, (0,255,0), 2)
cv2.imshow("coins", coins)
2 crop coins裁切提取硬币
for (i,c) in enumerate(cnts):# 裁切出一块长方形区域,用来放圆形(x,y,w,h) = cv2.boundingRect(c)print("coin #{}".format(i+1))coin = image[y:y+h, x:x+w]cv2.imshow("Coin", coin)# 新建一块大的画布 mask = np.zeros(image.shape[:2], dtype = "uint8")# 找出轮廓圆的圆心和半径# 输入为轮廓,输出为圆心和半径((centerX,centerY),radius) = cv2.minEnclosingCircle(c)# 画出圆,这些圆本质上是一个白色蒙版,mask成为一个遮罩cv2.circle(mask,(int(centerX), int(centerY)), int(radius), 255, -1)# 把mask缩小到和coin一样大的长方形区域mask = mask[y:y+h, x:x+w]cv2.imshow("Masked Coin", cv2.bitwise_and(coin,coin,mask = mask))
OpenCV-python学习笔记(六)——梯度算子,边缘检测和轮廓提取相关推荐
- Python学习笔记六——画小猪佩奇
目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...
- Python学习笔记(六)
1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...
- opencv进阶学习笔记11:cannny边缘检测,直线检测,圆检测
基础版笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) cannny边缘检测 基础版边 ...
- python学习笔记六 初识面向对象上(基础篇)
python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性是继承. ...
- 【懒懒的Python学习笔记六】
大多数程序旨在最终解决用户问题,为此通常需要从用户那里输入信息,在本章学习中,我们将学习Python的raw_input()函数接受用户输入以及学习while循环来控制程序的运行. 函数raw_inp ...
- Python学习笔记六(Python time模块)
通过python time模块提供的函数和方法可以获取与时间相关的操作,例如:获取系统时间,统计程序执行时间,WEB程序的响应时间等. 1)time.time(),该函数返回从1970年1月1日0点0 ...
- Python学习笔记(六)Python基础_数据类型——字符串
文章目录 字符串 字符串输入 字符串拼接 字符串操作 字符串格式化 访问字符串中的值 字符串切片 字符串遍历 常用的字符串方法 字符串 字符串是 Python 中最常用的数据类型:一般以使用引号' ' ...
- openCV Python学习笔记(二)画几何
此处要花几何图形,我们需要用到如下几个函数: cv2.line 画线函数 cv2.circle 画圆函数 cv2.ellipse 画椭圆 cv2.rectangle 画矩形 1.画线 img=cv2. ...
- python学习笔记六:Series
Series是一种类似于一维数组的对象,由以下两部分组成: values:一组数据(ndarray或list类型) index:相关的数据索引标签 一维数组默认索引为0,1,2,3...,而Serie ...
- Python学习笔记(六)—几个标准类型内建函数
比如说cmp(),str(),type(),repr()等等 cmp(a,b)比较a和b,根据比较的结果返回一个整数i. 当a<b时返回i<0;(即-1) 当a>b时返回i>0 ...
最新文章
- android ScrollView滚动距离和判断滚动停止状态
- 一文整理IEEE问题汇总【IEEE PDF Checker】(更新中)
- ActiveMQ简述
- 2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)
- 实例41:python
- Python机器学习:决策树002信息熵
- PyYAML和configparser模块讲解
- 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例
- SSM高校疫情防控出入信息管理系统设计与实现.rar(论文+源码)
- 未知USB设备(设备描述符请求失败)终于解决。网上查到的所有方法我都试过了,全部失败。我的成功方法就是调整“电源选项”
- 开源示波器DS203介绍、原理图学习
- SAP打开财务和物料的账期(OB52 MMRV MMPV)
- 计算机上的波特率标准,电子信号术语-波特率9600计算单位是波特/每秒(B/s)
- Cannot autogenerate id of type java.lang.Integer for entity
- Android开发经验谈:微信小程序的事件处理,灵魂拷问
- android新特性:DrawerLayout与NavigationView配合使用
- FLIR E85/E95/T620/t610/T540/T530红外热像仪全齐
- vue使用luckySheet前端excel的在线表格,导入显示以及导出excel文件
- 程序员必须认识的5件事情(ipvb学习网)
- GPC凝胶色谱理论和应用(二)
热门文章
- 持续集成部署Jenkins工作笔记0003---Web工程部署方式说明
- Netty工作笔记0003---IO模型-BIO-Java原生IO
- android学习笔记---61_Widgets,窗口小部件的制作...
- pytorch DistributedDataParallel提示未参与loss计算的变量错误
- Bezier曲线扫盲
- 用phpcms如何将静态页面制作成企业网站(上)
- WORD2010每次启动都要配置
- MyEclipse中使用Proxool+mysql连接池的方法
- easyui分页查询为什么会有下拉框_6个针对MySQL大数据量分页查询优化的锦囊妙计...
- 大数据日知录_腾讯T4专家精心整理:java+大数据+机器学习+数据挖掘+算法大集结...