当前位置: 首页 > news >正文

边缘检测算子之间的优劣

图像边缘

图像边缘是图像最基本的特征,边缘即图像局部不连续性(突变处),例如灰度级的突变、颜色的突变、纹理结构的突变等。边缘检测的方法绝大部分可以分为两类:

  • 基于查找一类:通过寻找图像一阶导数中的最大值和最小值来检测边界,通常是将边界定位在梯度最大的方向。
  • 基于零穿越的一类:通过寻找图像二阶导数零穿越来寻找边界,通常是laplacian过零点或者非线性差分表示过零点。

一阶导数的边缘算子

Roberts算子

Roberts算子是一种利用局部交叉差分寻找边缘的算子,常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。
优点:从图像处理的实际效果来看,边缘定位较准,对噪声敏感。适用于边缘明显且噪声较少的图像分割。

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

Prewitt算子

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

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

Sobel算子

Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。因为Sobel算子结合了高斯平滑和微分求导(分化),因此结果会具有更多的抗噪性,当对精度要求不是很高时,Sobel算子是一种较为常用的边缘检测方法。
img
优点:由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响,边缘定位效果不错。Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。

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

二阶微分的边缘算子

Laplacian 算子

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

Canny步骤:

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

相关文章:

  • 在软件测试摸爬滚打了8年,失业半年了。offer你在哪儿呀!
  • 15分钟了解sql注入(一) union注入
  • 基于混沌映射与差分进化自适应教与学优化算法-附代码
  • nginx基本使用一 ——————反向代理、负载均衡
  • 通讯录管理系统精解
  • 线上展厅表现形式 广州商迪
  • CDH 07Cloudera Manager freeIPA安装配置(markdown新版)
  • 22-09-23 西安 谷粒商城(05)CompletableFuture异步编排、nginx实现页面静态化
  • 【Javaweb】JSP标准标签库
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • React受控组件与非受控组件详解
  • Rust(4): 字符串类型
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • OSG跨平台编译:CMake跨平台安装(Windows、Linux、MacOS环境下安装)
  • OSG学习之一:坐标系
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 345-反转字符串中的元音字母
  • Mysql优化
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP变量
  • XML已死 ?
  • 仿天猫超市收藏抛物线动画工具库
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 解决iview多表头动态更改列元素发生的错误
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 异步
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #define,static,const,三种常量的区别
  • $.ajax中的eval及dataType
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (7)STL算法之交换赋值
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (二)JAVA使用POI操作excel
  • (九)c52学习之旅-定时器
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .Net 8.0 新的变化
  • .net 生成二级域名
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • @SentinelResource详解
  • [ C++ ] STL_list 使用及其模拟实现
  • [ solr入门 ] - 利用solrJ进行检索
  • []C/C++读取串口接收到的数据程序
  • [2021 蓝帽杯] One Pointer PHP
  • [autojs]autojs开关按钮的简单使用
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [C#]DataTable常用操作总结【转】