7.opencv——边缘检测( 拉普拉斯(Laplacian),Sobel,Canny边缘检测)

2023-11-13

边缘检测

\qquad 各类图像中,由于不同物体对电磁波的反射特性不同,在物体与背景、不同物体的交接处,图像的灰度将发生明显的变化,在图像中产生了边缘。边缘检测技术利用灰度的变化信息检测物体边缘,得到物体的轮廓,实现图像分割。边缘检测是所有基于边界的分割方法的第一步。
\qquad 如下图所示,沿着剖面线从左到右经过时,在进入和离开斜面的变化点,一阶导数为正。在灰度级不变的区域,一阶导数为 0;在边缘与黑色一边相关的跃变点二阶导数为正数,在与亮色一边相关的跃变点二阶导数为负数,沿着斜坡和灰度为常数的区域为 0。
\qquad 一阶导数可以用于检测图像中的一个点是否是边缘点(数字图像中一阶导数用梯度计算);二阶导数可以用于判断一个边缘像素是在边缘亮的一边还是暗的一边(数字图像中二阶导数用拉普拉斯算子计算)。为在噪声的影响下准确得到物体的边缘信息,需要先去噪,然后提取物体边缘。一般使用平滑模板或中值滤波等平滑滤波方法消除噪声;使用拉普拉斯、Sobel等边缘提取模板突出物体的边缘,然后进行二值化处理,得到物体的边缘信息。
在这里插入图片描述

拉普拉斯(Laplacian)边缘检测

\qquad 拉普拉斯边缘检测的性能虽然不错,但是要进行二阶微分的运算,会把图像中的噪声扩大。在实际应用中,通常都是先用高斯函数将图像进行预先平滑,然后用拉普拉斯边缘检测找出图像中的陡峭边缘。
拉普拉斯是用二阶差分计算边缘的,连续函数的情况下1. 在一阶微分图中极大值或极小值处,认为是边缘。2.在二阶微分图中极大值和极小值之间的过 0 点,被认为是边缘。
在这里插入图片描述
拉普拉斯算子推导:
一阶差分:f '(x) = f(x) - f(x - 1)
二阶差分:f '(x) = (f(x + 1) - f(x)) - (f(x) - f(x - 1))
化简后:f '(x) = f(x - 1) - 2 f(x)) + f(x + 1)
提取前面的系数:[1, -2, 1]
二维的情况下,同理可得
f '(x, y) = -4 f(x, y) + f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1)
提取各个系数,写成模板的形式:
[ 0 1 0 1 − 4 1 0 1 0 ] \left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \\ \end{matrix} \right] 010141010
\qquad Laplacian(拉普拉斯)边缘检测使用图像矩阵与拉普拉斯核进行卷积运算,其本质是计算图像中任意一点与其在水平方向和垂直方向上4个相邻点平均值的差值。常用的拉普拉斯核如下:
[ 0 1 0 1 − 4 1 0 1 0 ] \left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \\ \end{matrix} \right] 010141010
[ 0 − 1 0 − 1 4 − 1 0 − 1 0 ] \left[ \begin{matrix} 0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \\ \end{matrix} \right] 010141010
[ 0 2 0 2 − 8 2 0 2 0 ] \left[ \begin{matrix} 0 & 2 & 0 \\ 2 & -8 & 2 \\ 0 & 2 & 0 \\ \end{matrix} \right] 020282020
[ 0 − 2 0 − 2 8 − 2 0 − 2 0 ] \left[ \begin{matrix} 0 & -2 & 0 \\ -2 & 8 & -2 \\ 0 & -2 & 0 \\ \end{matrix} \right] 020282020

cv2.Laplacian()函数用于实现Laplacian边缘检测,其基本格式如下:

dst=cv2.Laplacian(src,depth,ksize,scale,delta,borderType) 

其参数说明如下:

参数 说明
dst 表示边缘检测结果图像
src 为原图像
depth 为目标图像的深度,默认是-1,与原图深度一致
ksize 为用于计算二阶导数滤波器的系数,必须为1、3、5、7,默认为1。
scale 为可缩放导数的比例常数,默认情况下没有伸缩系数
delta 为添加到边缘检测结果中的可选增量值,默认情况下没有额外值
borderType 为边界值类型,默认值为cv2.BORDER_DEFAULT
import cv2


img = cv2.imread('bee.jpg')  		        # 读取图像
cv2.imshow('original', img)  	            # 显示原图像
img2 = cv2.Laplacian(img, cv2.CV_8U) 	    # 边缘检测
cv2.imshow('Laplacian', img2)  	            # 显示结果
cv2.waitKey(0)

在这里插入图片描述

Sobel边缘检测

Sobel算子对图像中的每个像素,考察上、下,左、右邻点灰度的加权差,与之接近的邻点的权值较大。据此,定义 Sobel 算子如下:
S ( i , j ) = ∣ ( f ( i − 1 , j − 1 ) − 2 f ( i − 1 , j ) + f ( i − 1 , i + 1 ) ) − ( f ( i + 1 , j − 1 ) − 2 f ( i + 1 , j ) + f ( i + l , j i + 1 ) ) ∣ + ∣ ( f ( i − 1 , j — 1 ) − 2 f ( i , j — 1 ) + f ( i + 1 , j − 1 ) ) − ( f ( i + 1 , j + 1 ) − 2 f ( i , j + 1 ) + f ( i + 1 , j + 1 ) ) ∣ S(i,j)=|(f(i-1,j-1)-2f(i-1,j)+f(i-1,i+1))-(f(i+1,j-1)\\ -2f(i+1,j)+f(i+ l,ji+ 1))|+|(f(i-1,j—1)-2f(i,j—1)\\ +f(i+1,j-1))-(f(i+1,j+1)-2f(i,j+1)+f(i+1,j+ 1))| S(i,j)=(f(i1,j1)2f(i1,j)+f(i1,i+1))(f(i+1,j1)2f(i+1,j)+f(i+l,ji+1))+(f(i1,j1)2f(i,j1)+f(i+1,j1))(f(i+1,j+1)2f(i,j+1)+f(i+1,j+1))
适当取门限 TH。作如下判断:若 S(i,j)>TH,则(i,j)为阶跃状边缘点,而(S(i,j))则是边缘图像。Sobel算子具有一定的噪声抑制能力,检测效果较为理想,但所得边缘较粗,至少为两像素。
Sobel边缘检测将高斯滤波和微分结合起来执行图像卷积运算,其结果具有一定的抗噪性。
cv2.Sobel()函数用于实现Sobel边缘检测,其基本格式如下:

dst=cv2.Sobel(src,depth,dx,dy,ksize,scale,delta,borderType) 

其参数说明如下:

参数 说明
dst 表示边缘检测结果图像
src 为原图像
depth 为目标图像的深度,默认是-1,与原图深度一致
dx 为导数x的阶数
dy 为导数y的阶数
ksize 为用于计算二阶导数滤波器的系数,必须为1、3、5、7,默认为1。
scale 为可缩放导数的比例常数,默认情况下没有伸缩系数
delta 为添加到边缘检测结果中的可选增量值,默认情况下没有额外值
borderType 为边界值类型,默认值为cv2.BORDER_DEFAULT
import cv2


img = cv2.imread('bee.jpg')  	         # 读取图像
cv2.imshow('original', img)  	         # 显示原图像
img2 = cv2.Sobel(img, cv2.CV_8U, 0, 1)   # 边缘检测
cv2.imshow('Sobel', img2)  	             # 显示结果
cv2.waitKey(0)

在这里插入图片描述

Canny边缘检测

Laplacian边缘检测和Sobel边缘检测都是通过卷积运算来计算边缘,它们的算法比较简单,因此结果可能会损失过多的边缘信息或有很多的噪声。 而Canny边缘检测的算法更复杂,它包含下列5个步骤:
(1)使用高斯滤波去除图像噪声。
(2)使用Sobel核进行滤波,计算梯度。
(3)在边缘使用非最大值抑制。
(4)对检测出的边缘使用双阈值以去除假阳性。
(5)分析边缘之间的连接性,保留真正的边缘,消除不明显的边缘。
cv2.Canny()函数用于实现Canny边缘检测,其基本格式如下:

dst=cv2.Canny(src,threshold1,threshold2,apertureSize,L2gradient) 

其参数说明如下:

参数 说明
dst 表示边缘检测结果图像
src 为原图像
threshold1 为第1阈值
threshold2 为第2阈值
apertureSize 为计算梯度时使用的Sobel核大小
L2gradient 为标志
import cv2


img = cv2.imread('bee.jpg')  	            # 读取图像
cv2.imshow('original', img)  	            # 显示原图像
img2 = cv2.Canny(img, 200, 300)             # 边缘检测
cv2.imshow('Canny', img2)  	                # 显示结果
cv2.waitKey(0)

在这里插入图片描述

拉普拉斯(Laplacian),Sobel,Canny对比

算子 原理 优点 缺点
Laplacian 二阶导数算子,将在边缘处产生一个陡峭的零交叉。各向同性的,能对任何走向的界线和线条进行锐化,无方向性。 只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。 对噪声比较敏感,只适用于无噪声图象
Sobel 一阶微分算子,它利用像素邻近区域的梯度值来计算1个像素的梯度,然后根据一定的绝对值来取舍。X,Y方向各用一个模板,两个模板组合起来构成1个梯度算子。X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。 具有平滑作用,对灰度渐变和噪声较多的图像处理效果较好。 对边缘定位不是很准确,图像的边缘不止一个像素
Canny 先利用高斯平滑滤波器来平滑图像以除去噪声,接着采用一阶偏导的有限差分来计算梯度幅值和方向,然后对梯度幅值进行非极大值抑制,最后还采用两个阈值来连接边缘。 不容易受噪声干扰,能够检测到真正的弱边缘。 使用较大的滤波尺度,容易丢失一些细节;算子的双阈值要人为的选取,不可以自适应
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7.opencv——边缘检测( 拉普拉斯(Laplacian),Sobel,Canny边缘检测) 的相关文章

随机推荐

  • 【硬件电子】基础知识点学习记录

    眼图 USB信号质量判断通过下面哪个参数来判断 A 眼图 B 电压 C 信噪比 D 失真度 解析 眼图测试主要是用来检测高速串行传输的信号质量 本题选A 眼图 是由于示波器的余辉作用 将扫描所得的每一个码元波形重叠在一起 从而形成眼图 眼图
  • numa节点间CPU利用率不均衡 - wakeup affinity

    最近遇到服务器numa节点间cpu利用率不均衡 清除sched domain的flags中的AFFINE WAKEUPS标志位是一个优化方法 但是如果直接将AFFINE WAKEUPS关闭 将无法充分利用L2 L3 cache缓存命中带来的
  • JMeter软件的安装(超详细教程)

    JMeter软件的安装 超详细教程 1 jdk的安装 1 1jdk的环境变量配置 2 JMeter的安装 1 1JMeter的环境变量配置 3 JMeter的运行 第一个问题 为什么下载JMeter要先下载jdk 因为JMeter是Apac
  • 数据库还原-bak文件

    数据库还原 我知道有俩种方式 一种方式是直接在数据库上操作 一种是在数据库里用代码还原 第一种方法 1 数据库上右击 选择还原文件和文件组 2 选择目标数据库 选择bak文件 确定即可还原数据库 一般情况下这样就可以还原数据库了 但有时会报
  • nginx报错:./configure: error: C compiler cc is not found, gcc 是已经安装了的

    源码安装nginx报错 找不到gcc 但是实际上gcc是存在的 如下 configure checking for OS Linux 3 10 0 957 el7 x86 64 x86 64 checking for C compiler
  • GJB1188A校验C语言算法

    GJB1188A校验和算法 先将2个字节数据拼接为一个字 16字节 然后循环右移 之后模2算法合成 按位异或 就是 运算符 最后再反向移位 循环右移 消息队列中第一个字不移位 第二个右移1位 第三个右移2位 按位异或 相同为0 不同为1 消
  • rk3399 Android9.0 ota升级失败

    rk3399 Android9 0 ota升级失败 问题 在rk3399 Android9 0 项目中需要 ota 功能 user版本编译完ota升级包后 在同版本整包升级时遇到如下问题 抓到的logcat内容如下 1044 2343 D
  • 数据安全风险分析及应对策略研究

    报告从理论与实践层面对当前企业面临的内外部数据安全风险进行分析与研究 完成了以下几方面的探索 一是梳理了当前数据安全面临的突出问题 二是提出了数据安全体系建设的行动思路和关键举措 三是提出了数据安全建设发展建议 关注公众号 互联互通社区 回
  • angular自动化测试--protractor

    前戏 面向模型编程 测试驱动开发 先保障交互逻辑 再调整细节 by 雪狼 为什么要自动化测试 1 提高产出质量 2 减少重构时的痛 反正我最近重构多了 痛苦经历多了 3 便于新人接手 angular自动化测试主要分 端到端测试和单元测试 很
  • 专访戴文渊:第四范式(现在)是一家怎样的公司?

    李根 发自 凹非寺 量子位 报道 公众号 QbitAI 第四范式创始人及CEO戴文渊 第四范式是一家备受关注的公司 仅创始团队成员来看 哪一个不是计算机 机器学习领域响当当的名字 戴文渊是ACM2005全球冠军 百度机器学习系统带队打造者
  • RecyclerView中item布局的"match_parent"属性失效--LayoutInflate的深入了解

    用recyclerview 给item布局使用了match parent属性 运行后不起作用 查了下 是在onCreateViewHolder中加载布局时候出了问题 一开始用的View Inflate方法 查看源码后 发现View infl
  • Java学生个人信息录入

    编写 Java 程序显示学生的个人信息 定义类Student 该类中应该有三个私有属性 姓名 name 年龄 age 性别 sex 输入 第一行为一个数 表示录入学生个数 第二行依次为学生姓名 年龄 性别 最后一行输入一个学生的姓名 输出
  • 【selenium】python+selenium+unittest,关于每次执行完一个测试用例都关闭浏览器等时间较长的问题之解决方案...

    我一直在思考第一个博客应该写什么 然后我就解决了开通博客后解决的第一个问题 择题不如撞题 如果大多数人和我一样 接触python selenium unittest是从selenium IDE开始的话 你也一定会遇到这样的问题 我们写了5个
  • 论文阅读_大模型_ToolLLM

    英文名称 ToolLLM Facilitating Large Language Models to Master 16000 Real world APIs 中文名称 TOOLLLM 帮助大语言模型掌握16000多个真实世界的API 文章
  • telnet出现Connection closed by foreign host

    2018 10 26 执行命令 telnet smtp exmail qq com 465 出现信息 root pengman Desktop telnet 10 223 30 128 7027 Tring 10 223 30 128 70
  • 50 道 Java 基础编程练习题

    https gold xitu io post 58a4276f61ff4b006c899609
  • CMake 入门实战(精)

    http www hahack com codes cmake 从实例入手 讲解 CMake 的常见用法 Contents 什么是 CMake 入门案例 单个源文件 多个源文件 自定义编译选项 安装和测试 支持 gdb 添加环境检查 添加版
  • Java/JDK 21正式发布!15个特性一览

    订阅专栏 JDK 21已经于2023年9月19日正式发布 本文总结了JDK 21发布的新特性 发布版本说明 根据发布的规划 这次发布的 JDK 21 将是一个长期支持版 LTS 版 LTS 版每 2 年发布一个 上一次长期支持版是 21 年
  • s24服务器维护时长,服务器维护:艾锑人告诉您Mbps和mb/s换算知识

    影响我们一生百倍差距的四大效应 观察者效应 你的世界是什么样是由你的观察决定的 这个效应是在 潜能突破 研习营课堂上发现的 我们有个练习叫三生万物 每个人都会成为一次观察者角色 当大家在成为其他角色时 他们总是发现不了自己的问题 无论我们怎
  • 7.opencv——边缘检测( 拉普拉斯(Laplacian),Sobel,Canny边缘检测)

    边缘检测 边缘检测 拉普拉斯 Laplacian 边缘检测 Sobel边缘检测 Canny边缘检测 拉普拉斯 Laplacian Sobel Canny对比 边缘检测 qquad 各类图像中 由于不同物体对电磁波的反射特性不同 在物体与背景