边缘检测

边缘检测的目的是标识数字图像中亮度变化明显的点,边缘检测是特征提取的重要领域。

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(学习五)边缘检测的更多相关文章

  1. 风炫安全Web安全学习第十六节课 高权限sql注入getshell

    风炫安全Web安全学习第十六节课 高权限sql注入getshell sql高权限getshell 前提条件: 需要知道目标网站绝对路径 目录具有写的权限 需要当前数据库用户开启了secure_file ...

  2. 第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表、课程评论表、用户收藏表、用户消息表、用户学习表

    第三百七十六节,Django+Xadmin打造上线标准的在线教育平台—创建用户操作app,在models.py文件生成5张表,用户咨询表.课程评论表.用户收藏表.用户消息表.用户学习表 创建名称为ap ...

  3. 第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点 1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

  4. 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)

    风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...

  5. 风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧

    风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧 XSS绕过-过滤-编码 核心思想 后台过滤了特殊字符,比如说

  6. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  7. 第十六节、基于ORB的特征检测和特征匹配

    之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因.人们提出了使用ORB来替代SIFT和SURF.与前两者相比,ORB有更快的速度.ORB在2011年才首次发布.在前面小节中 ...

  8. 第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

    第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页 ...

  9. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  10. 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 ...

随机推荐

  1. Elasticsearch 通关教程(七): Elasticsearch 的性能优化

    硬件选择 Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch. ...

  2. ASP.NET Core 2.1 : 十四.静态文件与访问授权、防盗链

    我的网站的图片不想被公开浏览.下载.盗链怎么办?本文主要通过解读一下ASP.NET Core对于静态文件的处理方式的相关源码,来看一下为什么是wwwroot文件夹,如何修改或新增一个静态文件夹,为什么 ...

  3. 随心测试_数据库_003 <数据库存储结构>

    接上篇:了解了_数据库系统组成,继续理解必备知识点:数据库存储_逻辑结构 快速理解 数据存储结构:数据库系统_数据库_表 1. 理解什么是数据库 数据库发展:大致由 人工管理.文件系统.数据库系统(高 ...

  4. JS 转换HTML转义符

    JS转换HTML转义符   //去掉html标签 1 2 3 function removeHtmlTab(tab) {  return tab.replace(/<[^<>]+?& ...

  5. Linux 下操作Mysql指令的总结 远程连接的设置

    参考博客:https://www.cnblogs.com/liaocheng/p/4243579.html (常用命令) https://www.cnblogs.com/zhangzhu/archiv ...

  6. 简单数论之整除&质因数分解&唯一分解定理

    [整除] 若a被b整除,即a是b的倍数,那么记作b|a("|"是整除符号),读作"b整除a"或"a能被b整除".b叫做a的约数(或因数),a ...

  7. Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用(转)

    原文地址:https://www.cnblogs.com/fashflying/p/6908028.html 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对 ...

  8. jdk自带的监测cpu/内存、线程等信息的工具

    Jvisualvm:jdk自带的监控工具(JDK1.6+) 在终端中输入Jvisualvm回车出现如下界面:

  9. codeforces 792A-D

    先刷前四题,剩下的有空补. 792A New Bus Route 题意:给出x 轴上的n 个点,问两个点之间的最短距离是多少,有多少个最短距离. 思路:排序后遍历. 代码: #include<s ...

  10. 'python'不是内部或外部命令,也不是可运行程序或批处理文件

    配置两个环境变量: 我的电脑——属性——高级系统设置——环境变量——用户变量——path(新建) 1.配置python\python.exe所在的路径       path新建:C:\Users\Py ...