第十六节,OpenCV(学习五)边缘检测
边缘检测
边缘检测的目的是标识数字图像中亮度变化明显的点,边缘检测是特征提取的重要领域。
1、检测方法
边缘检测的方法大致分为两类:基于搜索和基于零交叉
基于搜索的边缘检测方法首先计算边缘强度,通常用一阶导数表示,例如梯度模,然后计算估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到梯度模的最大值。
基于零交叉的方法是找到由图像得到的二阶导数的零交叉点来定位边缘,通常用拉普拉斯算子或非线性微分方程的零交叉点。
2、Sobel边缘检测算子
Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但边缘不如Canny检测的准确,Socel算子是高斯平滑和微分操作的结合体,所以抗噪声能力强,尤其是效率要求较高,对细纹理不太关系的时候。
模板:
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
参数:
- src:传入的图像
- ddepth:图像的深度
- dx、dy求导的阶数,0表示这个方向上没有求导,所填数一般为0、1、2.
- ksize:Sobel算子的大小,即卷积核的大小,必须为奇数
- scale:缩放倒数的比例常数,默认情况为没有伸缩系数
- borderType:判断图像边界的模式,默认值为cv2.BORDER_DEFAULT。
import numpy as np
import cv2
# Sobel边缘检测算子
img = cv2.imread('dog.jpg',0)
x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
# cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
# 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
Scale_abX = cv2.convertScaleAbs(x)
Scale_abY = cv2.convertScaleAbs(y)
result = cv2.addWeighted(Scale_abX, 0.5, Scale_abY, 0.5, 0)
cv2.imshow('img', img)
cv2.imshow('Scale_absX', Scale_abX)
cv2.imshow('Scale_absY', Scale_abY)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sobel算子是在两个方向计算的,最后还需要cv2.addWeighted()函数将其组合起来
result = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, type]])
其中alpha是第一幅图片中元素的权重,beta是第二幅图像中元素的权重,gamma是加到最后结果上的一个值。
当Sobel()函数的参数ksize=-1时,就演变成了3x3的Scharr算子。算子的模板为:
3、拉普拉斯算子(Laplacian)
Laplacian函数实现的方法是先用Sobel算子计算二阶x和y导数,在求和:
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
- src:是需要处理的图像
- ddepth:是图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度
- ksize:算子的大小,即卷积核的大小,必须为1,3,5,7,;默认为1.
import numpy as np
import cv2
# 拉普拉斯算子
img = cv2.imread('dog.jpg', 0)
laplacian = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
dst = cv2.convertScaleAbs(laplacian)
cv2.imshow('img', img)
cv2.imshow('laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
当参数ksize越大即卷积核越大时,算子对图像梯度的变化越敏感,可以经过高斯模糊处理一下,去掉很多噪声。
blur = cv2.GaussianBlur(img, (3, 3), 0) laplacian = cv2.Laplacian(blur, cv2.CV_16S, ksize=3)
4、Canny算子
图像边缘检测必须满足两个条件:一是能有效地抑制噪声;而是必须尽量精确确定边缘的位置。
根据对信噪比与定位乘积进行测度,得到最优化逼近算子,这就是Canny边缘检测算子。
算法的基本步骤:
- 用高斯滤波器平滑图像
- 用一阶偏导的有限差分来计算梯度的幅值和方向
- 对梯度幅值进行非极大值抑制
- 用双阈值算法检测和连接边缘
canny = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
image:需要处理的原图像单通道的灰度图
threshold1:阈值1
threshold2:阈值2,较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的,所以应用娇小的第一个阈值将这些间断的边缘连接起来。
apertureSize:卷积核的大小
L2gradient:是一个bool值,如果为true,则使用更精确的L2翻书进行计算(即两个方向的导数的平方和再平方),否则使用L2范数(直接将两个方向导数的绝对值相加)
import numpy as np
import cv2
img = cv2.imread('dog.jpg', 0)
blur = cv2.GaussianBlur(img, (3, 3), 0)# 用高斯滤波处理图像
canny = cv2.Canny(blur, 50, 150) # 50是最小阈值,150是最大阈值
cv2.imshow('img', img)
cv2.imshow('canny', canny)
cv2.waitKey(0)
cv2.destroyAllWindows()
在运行时可以调整阈值大小,对图像进行边缘提取:
import numpy as np
import cv2
lowThreshold = 0
maxThreshold = 100
ratio = 3
kernel_size = 3
img = cv2.imread('dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 1)
cv2.namedWindow('Canny')
def CannyThreshold(x):
position = cv2.getTrackbarPos('CannBar','Canny')
canny = cv2.Canny(blur, position, position*2.5)
cv2.imshow('Canny', canny) cv2.createTrackbar('Min threshold', 'Canny', lowThreshold, maxThreshold, CannyThreshold)
CannyThreshold(0)
if cv2.waitKey(0) == 27:
cv2.destroyAllWindows()
第十六节,OpenCV(学习五)边缘检测的更多相关文章
- 风炫安全Web安全学习第十六节课 高权限sql注入getshell
风炫安全Web安全学习第十六节课 高权限sql注入getshell sql高权限getshell 前提条件: 需要知道目标网站绝对路径 目录具有写的权限 需要当前数据库用户开启了secure_file ...
- 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表
第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...
- 第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点
第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点 1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题
- 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)
风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...
- 风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧
风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧 XSS绕过-过滤-编码 核心思想 后台过滤了特殊字符,比如说
- 第一百二十六节,JavaScript,XPath操作xml节点
第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...
- 第十六节、基于ORB的特征检测和特征匹配
之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...
- 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承
第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...
- centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课
centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 ...
- centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,curl,ping ,telnet,traceroute ,dig ,nc,nmap,host,nethogs 第十六节课
centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,cur ...
随机推荐
- 你所不知道的ASP.NET Core MVC/WebApi基础系列(一)
前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会 ...
- 使用原生 JS 复制文本兼容移动端 iOS & android
注意事项 使用 JS 实现复制功能并不是很难,但是有几个需要注意的地方. 首先文本只有选中才可以复制,所以简单的做法就是创建一个隐藏的 input,然后绑定需要复制的文本. 另外如果将 input 设 ...
- 身份认证功能chiro的使用
package com.cun;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apa ...
- JS 设计模式五 -- 命令模式
概念 命令模式中的命令(command) 指的是 一个执行某些待定事情的指令. 用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 例子 假设html结构如下: &l ...
- JQuery td内容获取,修改
业务需求:获取某个表格中每一行第四个td内容,并根据内容为当前td重新赋值 $(".listtable.table.table-striped.table-bordered.table-ho ...
- OpenCV4.1.0实践(1) - 环境配置及使用
Pycharm下虚拟环境配置 1.下载whl文件 下载地址:python extension packages 搜索opencv,根据自己的版本下载,我用的python版本是3.5.2,64位: 2. ...
- 判定你的java应用是否正常(是否内存、线程泄漏)的一个简单方法
给大家推荐一个最简单的判定你的java应用是否正常的方法: step1:部署你的应用,让它跑起来: step2:打开jdk下bin目录下的jconsole.exe工具,连接到你的应用——以监测线程和内 ...
- 能ping通虚拟机中的Ubuntu,使用XShell连不上
1.在宿主机上telnet 虚拟机ip 22如果显示端口无法接通,说明你的/etc/init.d/sshd 是stop或者是异常的. 2.如果没有sshd服务,使用" sudo apt-g ...
- tp5问题整理
问题一:致命错误: Class 'think\controller' not found 原因:controller首字母要大写 解决:use think\Controller; 问题二:html页面 ...
- ADT打开layout目录的xml报错java.lang.NullPointerException
原因为使用了Android Studio的绿色JRE,必须要安装安装版JDK或者JRE,绿色版JRE放在ADT目录虽然能启动ADT但是不能启动layout目录的xml