【图像处理】边缘检测算子有哪些以及它们之间的对比

news2024/11/25 14:56:45

这个问题应该是做过传统图像处理的人都接触过的吧。粗略总结下,应该也不会问太细,面试官大概就考察下大家的知识面吧。

综述

边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。

图像边缘是图像最基本的特征,所谓边缘(Edge) 是指图像局部特性的不连续性。灰度或结构等信息的突变处称之为边缘。例如,灰度级的突变、颜色的突变,、纹理结构的突变等。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。

有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。

基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。

基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。

当然还有第三种例如被大规模使用的 canny 算子,这个会更加复杂些。

在检测物体边缘时,先对其轮廓点进行粗略检测,然后通过链接规则把原来检测到的轮廓点连接起来,同时也检测和连接遗漏的边界点及去除虚假的边界点。

图像梯度

图像梯度是边缘检测的基础知识,因此在讲边缘算子之前先复习下图像梯度的知识。

一幅图像 f f f 在位置 ( x , y ) (x,y) (x,y) 处的梯度定义如下:

因为图像是一种离散分布,因此求导其实就是做差分, g x g_x gx g y g_y gy 定义如下:
g x = ∂ f ( x , y ) ∂ x = f ( x + 1 , y ) − f ( x , y ) g y = ∂ f ( x , y ) ∂ y = f ( x , y + 1 ) − f ( x , y ) g_x = \frac{\partial f(x,y)}{\partial x} = f(x+1,y) - f(x,y) \\ g_y = \frac{\partial f(x,y)}{\partial y} = f(x,y+1) - f(x,y) gx=xf(x,y)=f(x+1,y)f(x,y)gy=yf(x,y)=f(x,y+1)f(x,y)
其实上面的这两个公式可以使用下图的一维模板对图像 f ( x , y ) f(x,y) f(x,y) 进行滤波得到。

img

梯度 ∇ f \nabla f f 表示的是图像 f f f 在位置 ( x , y ) (x,y) (x,y) 处的梯度向量。梯度的方向以及梯度的大小表示如下:

梯度方向:
Θ = a r g t a n ( g y g x ) \Theta=argtan(\frac{g_y}{g_x}) Θ=argtan(gxgy)
梯度大小:

一阶导数的边缘算子

Roberts 算子

Roberts算子是一种利用局部交叉差分寻找边缘的算子,常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。

**优点:**从图像处理的实际效果来看,边缘定位较准,对噪声敏感。适用于边缘明显且噪声较少的图像分割。

**缺点:**提取的边缘线条较粗。

Roberts算子的模板分为水平方向和垂直方向,如下式所示,从其模板可以看出,Roberts算子能较好的增强正负45度的图像边缘。

例如,下面给出Roberts算子的模板,在像素点 P5 处 x x x y y y 方向上的梯度大小 g x g_x gx g y g_y gy 分别计算如下:


g x = ∂ f ∂ x = P 9 − P 5 g y = ∂ f ∂ y = P 8 − P 6 g_x = \frac{\partial f}{\partial x}=P9-P5 \\ g_y = \frac{\partial f}{\partial y} =P8-P6 gx=xf=P9P5gy=yf=P8P6
在代码实现方面,便可以如同卷积一样构造两个滤波器矩阵对图像进行卷积,假设使用第一个模板卷积后得到的结果为 f y f_y fy ,使用第二个模板卷积后得到的结果为 f x f_x fx ,那么最终的结果为这两个中间结果的加权平均,例如 0.5 ∗ f x + 0.5 ∗ f y 0.5*f_x +0.5*f_y 0.5fx+0.5fy 。下同!

Prewitt 算子

Prewitt算子采用 3x3 模板对区域内的像素值进行计算,而Robert算子的模板为 2x2 ,故Prewitt算子的边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。Prewitt算子适合用来识别噪声较多、灰度渐变的图像。

**优点:**Prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均。

**缺点:**该算子具有平滑的作用,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。

同样,下面给出 Prewitt 算子的模板,在像素点 P5 处 x x x y y y 方向上的梯度大小 g x g_x gx g y g_y gy 分别计算如下:

img
g x = ∂ f ∂ x = ( P 7 + P 8 + P 9 ) − ( P 1 + P 2 + P 3 ) g y = ∂ f ∂ y = ( P 3 + P 6 + P 9 ) − ( P 1 + P 4 + P 7 ) g_x = \frac{\partial f}{\partial x}=(P7+P8+P9)-(P1+P2+P3) \\ g_y = \frac{\partial f}{\partial y}=(P3+P6+P9)-(P1+P4+P7) gx=xf=(P7+P8+P9)(P1+P2+P3)gy=yf=(P3+P6+P9)(P1+P4+P7)

Sobel 算子

Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。因为Sobel算子结合了高斯平滑和微分求导(分化),因此结果会具有更多的抗噪性,当对精度要求不是很高时,Sobel算子是一种较为常用的边缘检测方法。

优点:由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响,边缘定位效果不错。Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。

**缺点:**但检测出的边缘容易出现多像素宽度。

同样,下面给出 Sobel 算子的模板,在像素点 P5 处 x x x y y y 方向上的梯度大小 g x g_x gx g y g_y gy 分别计算如下:

img
g x = ∂ f ∂ x = ( P 7 + 2 ∗ P 8 + P 9 ) − ( P 1 + 2 ∗ P 2 + P 3 ) g y = ∂ f ∂ y = ( P 3 + 2 ∗ P 6 + P 9 ) − ( P 1 + 2 ∗ P 4 + P 7 ) g_x = \frac{\partial f}{\partial x}=(P7+2*P8+P9)-(P1+2*P2+P3) \\ g_y = \frac{\partial f}{\partial y}=(P3+2*P6+P9)-(P1+2*P4+P7) gx=xf=(P7+2P8+P9)(P1+2P2+P3)gy=yf=(P3+2P6+P9)(P1+2P4+P7)

二阶微分的边缘算子

Laplacian 算子

Laplace算子是一种各向同性算子,不能检测出边的方向。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,拉普拉斯算子一般不会用于边的检测,而是常用来判断边缘像素位于图像的明区或暗区。

Laplacian 算子的定义:
L a p l a c i a n ( f ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 ∂ 2 f ∂ x 2 = f ( x + 1 ) − f ( x ) ∂ x = [ f ( x + 2 ) − f ( x + 1 ) ] − [ f ( x + 1 ) − f ( x ) ] ∂ 2 f ∂ y 2 = f ( y + 1 ) − f ( y ) ∂ y = [ f ( y + 2 ) − f ( y + 1 ) ] − [ f ( y + 1 ) − f ( y ) ] Laplacian(f)=\frac{\partial^2f}{\partial x^2}+\frac{\partial^2f}{\partial y^2} \\ \frac{\partial^2f}{\partial x^2} = \frac{f(x+1)-f(x)}{\partial x} = [f(x+2)-f(x+1)]-[f(x+1)-f(x)] \\ \frac{\partial^2f}{\partial y^2} = \frac{f(y+1)-f(y)}{\partial y} = [f(y+2)-f(y+1)]-[f(y+1)-f(y)] Laplacian(f)=x22f+y22fx22f=xf(x+1)f(x)=[f(x+2)f(x+1)][f(x+1)f(x)]y22f=yf(y+1)f(y)=[f(y+2)f(y+1)][f(y+1)f(y)]
理论上计算公式是上面那样,但是计算出来后重心感觉有点偏移,为了便于计算以及直观形象,很多教程往往会表示成下面这样:(这是我自己的看法,目前没看到有这样的说法)
∂ 2 f ∂ x 2 = f ( x + 1 ) − f ( x ) ∂ x = [ f ( x + 1 ) − f ( x ) ] − [ f ( x ) − f ( x − 1 ) ] ∂ 2 f ∂ y 2 = f ( y + 1 ) − f ( y ) ∂ y = [ f ( y + 1 ) − f ( y ) ] − [ f ( y ) − f ( y − 1 ) ] \frac{\partial^2f}{\partial x^2} = \frac{f(x+1)-f(x)}{\partial x} = [f(x+1)-f(x)]-[f(x)-f(x-1)] \\ \frac{\partial^2f}{\partial y^2} = \frac{f(y+1)-f(y)}{\partial y} = [f(y+1)-f(y)]-[f(y)-f(y-1)] x22f=xf(x+1)f(x)=[f(x+1)f(x)][f(x)f(x1)]y22f=yf(y+1)f(y)=[f(y+1)f(y)][f(y)f(y1)]

两个方向加起来的话:
∇ 2 ( f ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 = [ f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) ] − 4 f ( x , y ) \nabla^2(f)=\frac{\partial^2f}{\partial x^2}+\frac{\partial^2f}{\partial y^2} =[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y) 2(f)=x22f+y22f=[f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)]4f(x,y)
上述是数学表达形式的拉普拉斯算子,那么我们可以将其表达为模板的形式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jkv5iWlJ-1670937566389)(https://raw.githubusercontent.com/xn1997/picgo/master/jqWOwnrSLoE5C3d.jpg)]

从以上的计算过程可以看出,该算子对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理。

由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。

拉普拉斯锐化的基本方法可以由下式表示:

img

我们发现Laplacian算子进行边缘检测并没有像Sobel或Prewitt那样的平滑过程,所以它会对噪声产生较大的响应,并且无法分别得到水平方向、垂直方向或者其他固定方向的的边缘。但是它只有一个卷积核,所以计算成本会更低。


图像的一阶导数可以用于检测图像中的一个点是否在斜坡上;二阶导数的符号可以用于判断一个边缘点是在边缘亮的一边还是暗的一边。观察下面这张图可以得到答案:当一个边缘点的二阶函数的符号为负时,说明它在亮的一边,符号为正时,在暗的一边。(可以直接死记硬背:亮度跟二阶函数的正负号刚好相反)。

一条连接二阶导数正极值和负极值的虚构直线将在边缘中点附近穿过零点,据此可以用于确定粗边线的中心。

图片来源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zRbEdoi-1670937566776)(null)]

Canny

这大概是传统图像里被用的最多的边缘检测算子了。Canny提出了一个对于边缘检测算法的评价标准,包括:

  1. 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
  2. 检测到的边缘应精确定位在真实边缘的中心。
  3. 图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。

简单来说就是,检测算法要做到:边缘要全,位置要准,抵抗噪声的能力要强。

该算子求边缘点的具体算法步骤如下:

  1. 用高斯滤波器平滑图像:边缘检测算子受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。
  2. 用一阶偏导有限差分计算梯度幅值和方向,例如 Sobel
  3. 对梯度幅值进行非极大值抑制:sobel算子检测出来的边缘太粗了,我们需要抑制那些梯度不够大的像素点,只保留最大的梯度,从而达到瘦边的目的。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。
  4. 用双阈值算法检测和连接边缘:通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。对每一个弱边缘进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。

参考资料

几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny
数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)
图像处理常用边缘检测算子总结
Laplacian算子-Log算子-Dog算子边缘检测原理合集及实现
Canny边缘检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五章. 可视化数据分析图表—常用图表的绘制3—散点图,面积图,热力图

第五章. 可视化数据分析图 5.3 常用图表的绘制3—散点图,面积图,热力图 本节主要介绍常用图表的绘制,主要包括散点图,面积图,热力图。 1.散点图(matplotlib.pyplot.scatter) 散点图主要用来查…

Redux Hooks actions 调用方式优化(一)

hooks 可以说是现在react编程的的主流,redux 迎合这个主流也推出 toolkit 工具集来。但是在用toolkit 搭建前端框架后,给人的感觉就是比原先的connect 那一套好些,但用起来还是挺繁琐的。 一 toolkit 搭建的正常使用版本 1.1 创建store im…

三、pcm音频转wav

前言 ffmpeg录制下来的音频为pcm格式(内部存储着十六进制数据),但pcm格式的音频无法直接播放 本文先将pcm转换成wav格式(提要提前了解音频知识) 首先分析wav文件格式(wav的本质是在pcm数据前加上文件头&a…

[附源码]Node.js计算机毕业设计电子工厂进销存管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

《Linux运维总结:Centos7.6使用yum安装Mysql8.0.31》

一、使用yum安装mysql服务 官方:下载对应的yum源 1、yum源下载 [rootlocalhost ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm [rootlocalhost ~]# rpm -ivh mysql80-community-release-el7-7.noarch.rpm如下图所示:…

vsftpd 升级3.0.2-29 和 增加账号访问

一、下载文件至/opt 百度网盘: 链接: https://pan.baidu.com/s/1Ad20bm5fvw8WvtaV3uHGYA 提取码: 2pa9 二、安装 2.1、切换目录 命令:cd /opt 2.2、授权 命令:chmod x centos7.6-vsftpd-upgrade.sh 2.3、安装 命令:./cent…

D. Lucky Chains(gcd + 线性筛)

Problem - D - Codeforces 如果一对正整数(x,y)的最大公除数等于1(gcd(x,y)1),我们就把它们命名为幸运。 让我们把由(x,y)引起的链定义为一个由(x,y), (x1,y1), (x2,y2), ..., (xk,yk)组成的序列,对于某个整数k≥0。 如果链中的所有配对都是幸运的&…

2022-12-13 note

1、linux内核的特点 1. linux内核是完全开源的作者:linusgit --> 代码版本管理工具 2. linux内核源码支持多种不同的架构,比如arm架构,powerPC,mips,Risc-V,X86等 3. linux内核采用模块化的编译的思想 4. 在linux内核中只允许出现C代码或…

优秀的PM如何轻松应对公司90%以上的沟通难题

项目经理和PMO工作中最多的事情往往是沟通,但是你在工作中会不会遇到很多沟通难题?如果其他环节的人处理不好还可以理解,但是咱们处理不好就说不过去了,并且还会让人感觉不专业,丧失很多机会,甚至失去领导的…

代码随想录Day49|121.买卖股票的最佳时期、122.买卖股票的最佳时期II

文章目录121.买卖股票的最佳时期、122.买卖股票的最佳时期II121.买卖股票的最佳时期、 文章讲解:代码随想录 (programmercarl.com) 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 题目: 给定一个数组 prices…

Metal每日分享,调整灰度系数gamma滤镜效果

本案例的目的是理解如何用Metal实现灰度系数效果滤镜,输入像素rgb进行次方运算获取到新的rgb; Demo HarbethDemo地址 实操代码 // 灰度系数滤镜 let filter C7Gamma.init(gamma: 3.0)// 方案1: ImageView.image try? BoxxIO(element: originImage,…

[附源码]Node.js计算机毕业设计儿童闲置物品交易网站Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

六、JavaScript——变量的内存结构

一、内存 定义&#xff1a;内存是用于存储数据的地方&#xff0c;程序要执行一段代码&#xff0c;要先从硬盘加载到内存当中&#xff0c;再由内存发送给CPU,CUP才能对代码进行执行。 注&#xff1a;变量并不存储任何值&#xff0c;而是存储值的内存地址 JS定义一个变量 <s…

Telerik模拟生成规则的新设置

Telerik模拟生成规则的新设置 添加了对Microsoft.NET 7官方版本的支持。 添加了控制模拟生成规则的设置。 Telerik JustLock是一个易于使用的模拟工具&#xff0c;它将帮助您以前所未有的速度、更高的质量编写单元测试。JustLock允许您轻松地将测试场景与难以配置的依赖关系(如…

5G现场网的数字孪生体系架构

现场网面向钢铁生产和统一管理的场景&#xff0c;实现现场设备与数据采集器和控制器的网络连接和数据互通&#xff0c;现场网的ZigBee、蓝牙等短距离技术以及窄带物联网&#xff08; narrowbandinternetofthings,NB-IoT&#xff09;、超远距离&#xff08;longrange,LoRa&#…

病历开发SDK:TX Text Control ActiveX 31.x Crack

Visual Basic 6 应用程序的文档处功能齐全的文档编辑器 TX Text Control ActiveX是一种完全可编程的 Rich Edit 控件&#xff0c;它在专为 Visual Studio 设计的可重用组件中为开发人员提供了广泛的文字处理功能。它提供全面的文本格式、强大的邮件合并功能和所有文字处理关键概…

算法训练四十八天 | LeetCode 198、213、337打家劫舍专题

LeetCode 198 打家劫舍 题目简析&#xff1a; 不能偷相邻的屋子&#xff0c;求能偷到的最大金额 思路分析&#xff1a; //由于是相邻的才偷&#xff0c;因此&#xff0c;我们对于最基础的三间 //dp[3] 应该是 Math.max(dp[2],dp[1]nums[3]) //如果第一间加偷第三间的价值大…

pytest + yaml 框架 -10.allure 生成报告

前言 本插件是基于pytest框架开发的&#xff0c;所以pytest 的插件都能使用&#xff0c;生成报告可以用到 allure 报告 pip 安装插件 pip install pytest-yaml-yoyoallure 报告功能在 v1.0.8 版本上实现 allure 命令行工具 allure 是一个命令行工具&#xff0c;需要去githu…

大话设计模式之设计原则

设计原则 参考链接&#xff1a;https://datawhalechina.github.io/sweetalk-design-pattern/#/content/design_principles/dependence_inversion_principle 主要介绍以下五个设计原则&#xff1a; 1、单一职责原则 顾名思义&#xff0c;一个类只有一个职责&#xff0c;只会…

React 16.8+生命周期(新)

React16之后有三个生命周期被废弃&#xff1a; componentWillMountcomponentWillReceivePropscomponentWillUpdate React 16.8的生命周期分为三个阶段&#xff0c;分别是挂载阶段、更新阶段、卸载阶段。 挂载阶段&#xff1a; constructor&#xff1a;构造函数&#xff0c;最…