第十六节,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 ...
随机推荐
- django.db.utils.ProgrammingError: (1146, "Table 'db_gold.user_ip_info' doesn't exist") RuntimeError: Model class scanhosts.models.HostLoginInfo doesn't declare an explicit app_label and isn't in an a
Error Msg 创建了一个apps的目录将所有app放入apps文件中, 将apps路径加入sys.path中:sys.insert(0, os.path.join(BASE_DIR, " ...
- 一些矩阵范数的subgradients
目录 引 正交不变范数 定理1 定理2 例子:谱范数 例子:核范数 算子范数 定理3 定理4 例子 \(\ell_2\) <Subgradients> Subderivate-wiki S ...
- IO模型介绍
先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险 ...
- A Base Class pointer can point to a derived class object. Why is the vice-versa not true?
问题转载自:https://stackoverflow.com/questions/4937180/a-base-class-pointer-can-point-to-a-derived-class- ...
- bugku web web5
JSPFUCK??????答案格式CTF{**} http://123.206.87.240:8002/web5/ 字母大写 jspfuck这不是骂人吗,怎么回事啊? ·点进去看见有一个可以输入的框, ...
- CSS中各种居中的问题
1.元素水平居中 1.1 在父元素上使用text-align: center; father { text-align: center; } 1.2 margin: 0 auto; 在上一个问题中,我 ...
- YUI Compressor
简介 根据雅虎卓越性能团队的说法,40%到60%的雅虎用户拥有空闲缓存体验,所有页面浏览量中约有20%是使用空缓存完成的(请参阅Tenni Theurer在YUIBlog上的这篇文章)有关浏览器缓存使 ...
- maven deploy 指定-DaltDeploymentRepository
运行deploy出现如下错误: deployment failed repository element was not specified in the POM inside distributio ...
- fiddler和手机连接抓包实现
很好用的抓包工具,不需要手机usb连接就可以抓包,查找bug超方便 实现方法: 借鉴跳转 手机版本:andriod 7.1.1 上面的方法的基础上遇到的问题: 在浏览器下载下来证书后始终无法打开(或许 ...
- windows一键部署java项目
windows一键部署java项目 因为公司需求,要在windows的环境上做一键部署启动java项目,同时还要支持从安装界面动态修改配置文件的IP地址.就像安装软件一样将jdk,tomcat,mys ...