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

11.图像边缘检测的原理与实现

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)
数字图像处理(20): 边缘检测算子(Canny算子)

1.边缘检测介绍

1.1 边缘检测的基本原理

  边缘是图像的基本特征,所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的突变之处称之为边缘。如灰度级的突变、颜色的突变、纹理结构的突变等。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。
  图像的边缘有方向和幅度两种特性,边缘通常可以通过一阶导数或二阶导数检测得到。一阶导数是以最大值作为对应边缘的位置,而二阶导数则以过零点作为对应边缘的位置
  边缘检测是一种常用的图像分割技术,常用的边缘检测算子有Roberts Cross算子、Prewitt算子、Sobel算子、Kirsch算子、Laplacian算子以及Canny算子。

1.2 边缘检测算子分类

(1)一阶导数的边缘算子
  通过模版作为卷积核与图像的每个像素点做卷积运算,然后选择合适的阈值来提取图像的边缘。常用的有Roberts算子、Sobel算子和Prewitt算子。
(2)二阶导数的边缘算子
  依据与二阶导数过零点,常见的有Laplacian算子,此类算子对噪声敏感。
(3)其他边缘算子
  前面两类算子均通过微分来检测图像边缘,还有一种就是Canny算子,其就是在满足一定约束条件下推到出来的边缘检测最优化算子。

1.3 梯度

1.3.1 图像梯度

  为了达到寻找边缘的目的,检测灰度变化可用一阶导数或者二阶导数来完成。下面讨论一阶导数。
  为了在一副图像 f f f ( x , y ) (x,y) (x,y)位置处寻找边缘的强度和方向,所选择的工具就是梯度,梯度用 ∇ f \nabla f f来表示,并用向量来定义,定义如下所示:
∇ f = g r a d ( f ) = [ g x g y ] = [ ∂ f ∂ x ∂ f ∂ x ] (1) \nabla f=grad(f)=\begin{bmatrix}g_x \\g_y \end{bmatrix}=\begin{bmatrix}\frac{\partial f}{\partial x} \\ \\ \frac{\partial f}{\partial x} \end{bmatrix}\tag{1} f=grad(f)=[gxgy]= xfxf (1)
  其中,梯度 ∇ f \nabla f f为一个向量,他表示 f f f在位置 ( x , y ) (x,y) (x,y)处的最大变化率的方向。
  梯度的大小用 M ( x , y ) M(x,y) M(x,y)表示,则:
M ( x , y ) = m a g ( ∇ f ) = g x 2 + y y 2 (2) M(x,y)=mag(\nabla f)=\sqrt{g_x^2+y_y^2}\tag{2} M(x,y)=mag(f)=gx2+yy2 (2)
  其中, M ( x , y ) M(x,y) M(x,y)表示梯度向量方向变化率的值。
数学梯度的简单推导
  对于以函数 f ( x ) f(x) f(x)在点 x x x处的导数近似:将函数 f ( x + Δ x ) f(x+\Delta x) f(x+Δx)展开为 x x x的泰勒级数,令 Δ x = 1 \Delta x=1 Δx=1,且只保留该级数的线性项,则函数 f ( x ) f(x) f(x)的梯度 ∇ f \nabla f f计算为:
∇ f = ∂ f ∂ x = f ′ ( x ) = f ( x + 1 ) − f ( x ) (3) \nabla f = \frac{\partial f}{\partial x}=f^{'}(x)=f(x+1)-f(x) \tag{3} f=xf=f(x)=f(x+1)f(x)(3)

1.3.2 梯度算子

  由上面的数学推导可知,要得到一副图像的梯度,则要求图像的每一个像素点位置处计算偏导数。我们处理的是数字量,因此需要求关于一点的邻域上的偏导数的数字近似,因此一副图像 f f f,在 ( x , y ) (x,y) (x,y)位置处的 x x x y y 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 ) ∂ x = f ( x , y + 1 ) − f ( x , y ) (4) \begin{array}{c}g_x=\frac{\partial f(x,y)}{\partial x}=f(x+1,y)-f(x,y) \\ \\g_y=\frac{\partial f(x,y)}{\partial x}=f(x,y+1)-f(x,y)\end{array}\tag{4} gx=xf(x,y)=f(x+1,y)f(x,y)gy=xf(x,y)=f(x,y+1)f(x,y)(4)
  上述公式对所有 x x x y y y的有关值可用下图的一维模版对 f ( x , y ) f(x,y) f(x,y)的滤波得到。
在这里插入图片描述
  用于计算梯度偏导数的滤波器模版,通常称之为梯度算子、边缘算子和边缘检测算子等。
  对于不同的滤波器模版得到的梯度是不同的,这也就衍生出了很多算子,如Roberts、Prewitt、Sobel和Laplacian算子等。下面将详细介绍不同的算子。

2 Roberts算子

3 Prewitt算子

4 Sobel算子

4.1 基本原理

  Sobel算子是一种用于边缘检测的离散微分算子,他结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel算子再Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的点影响越大,从而实现图像锐化并突出边缘轮廓。
  Sobel算子根据像素点上下、左右邻点灰度的加权差,在边缘达到极值这一现象检测边缘。对噪音具有平滑作用,提供较为准确的边缘信息。因为Soble算子结合了高斯平滑和微分求导(分化),因此结果会具有较多的抗噪性,当对精度要求不高时,Sobel算子是一种较为常用的边缘检测算法。
  Soble算子的边缘定位更为准确,常用于噪声较多、灰度渐变的图像。其算法模板如下面的公式所示,其中 d x d_x dx表示水平方向, d y d_y dy表示垂直方向。
d x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] d y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] (4) d_x=\begin{bmatrix}-1 & 0 &1 \\-2 & 0 &2\\ -1 &0&1 \end{bmatrix}\qquad d_y=\begin{bmatrix}-1 & -2 &-1 \\0 & 0 &0\\ 1 &2&1 \end{bmatrix}\tag{4} dx= 121000121 dy= 101202101 (4)
  例如,下面给出Sobel算子的模板,在像素点P5处 x x x y y y方向上的梯度大小 g x g_x gx g y g_y gy分别计算为:
在这里插入图片描述
g x = ∂ f ( x , y ) ∂ x = ( P 7 + 2 P 8 + P 9 ) − ( P 1 + 2 P 2 + P 3 ) g y = ∂ f ( x , y ) ∂ x = ( P 3 + 2 P 6 + P 9 ) − ( P 1 + 2 P 4 + P 7 ) (4) \begin{array}{c}g_x=\frac{\partial f(x,y)}{\partial x}=(P7+2P8+P9)-(P1+2P2+P3) \\ \\g_y=\frac{\partial f(x,y)}{\partial x}=(P3+2P6+P9)-(P1+2P4+P7)\end{array}\tag{4} gx=xf(x,y)=(P7+2P8+P9)(P1+2P2+P3)gy=xf(x,y)=(P3+2P6+P9)(P1+2P4+P7)(4)
  图像中的每一个像素的横向以及纵向灰度值通过以下公式结合,来计算该点的灰度值大小:
G = G x 2 + G y 2 G=\sqrt{G_x^2+G_y^2} G=Gx2+Gy2
  通常为了提高效率,使用不开平方的近似值,但是这样做会损失精度,迫不得已的时候可以如下这样子:
G = ∣ G x ∣ + ∣ G y ∣ G=\mid{G_x}\mid + \mid G_y\mid G=∣Gx+Gy
  如果梯度G大于某一阈值,则认为该点 ( x , y ) (x,y) (x,y)为边缘点。

4.2 Sobel边缘检测的FPGA实现

4.3 Sobel边缘检测的MATLAB算法实现与验证

clc;
clear all ;
GRAY = imread('../img/1920X1080_gray.bmp');
[row,col] = size(GRAY);
sobel_result = zeros(row,col);
sobel_padding = zeros(row+2,col+2);x_mod = [-1,0,1;-2,0,2;-1,0,1];
y_mod = [-1,-2,-1;0,0,0;1,2,1];for i = 1:rowfor j = 1:colsobel_padding(i+1,j+1) = GRAY(i,j);end
endfor i = 1:row+2sobel_padding(i,1) = sobel_padding(i,2);sobel_padding(i,col+2) = sobel_padding(i,col+1);
endfor i = 1:col+2sobel_padding(1,i) = sobel_padding(2,i);sobel_padding(row+2,i) = sobel_padding(row+1,i);
endfor i = 2:row+1for j = 2:col+1matrix11 = sobel_padding(i-1,j-1);matrix12 = sobel_padding(i-1,j);matrix13 = sobel_padding(i-1,j+1);matrix21 = sobel_padding(i,j-1);matrix22 = sobel_padding(i,j);matrix23 = sobel_padding(i,j+1);matrix31 = sobel_padding(i+1,j-1);matrix32 = sobel_padding(i+1,j);matrix33 = sobel_padding(i+1,j+1);matrix = [matrix11,matrix12,matrix13;matrix21,matrix22,matrix23;matrix31,matrix32,matrix33];x_mult = matrix.* x_mod;y_mult = matrix.* y_mod;gx1 = sum(sum(x_mult()));gy1 = sum(sum(x_mult()));gx2 = gx1*gx1;gy2 = gy1*gy1;sobel_result(i-1,j-1) = sqrt(gx2+gy2);end
end
subplot(1,2,1)
matlab_Y = uint8(floor(sobel_result));
imshow(matlab_Y),title('MATLAB  Sobel算法图像');
subplot(1,2,2)
imshow(GRAY),title('原图像');

5 Laplacian算子

6 Canny算子

7 小结

相关文章:

11.图像边缘检测的原理与实现

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征,所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...

RVM安装ruby笔记

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…...

电力系统负荷预测方法

电力系统负荷是什么? 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础,以特定的数学方法或者建立数学模型的方式为手段,通过对电力负荷历史数据进行分析,对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)

vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白,内容未加载。 填坑: 打包配置要用相对路径 vite.config.ts文件中的base要改成./,之前加了项目…...

MySQL学习笔记(持续更行ing)

级别: 1. 了解,面试概率10% 2. 掌握,面试概率50% 3. 重点,面试概率80% 目录 1. 数据库**** 1.1. 概念**** 1.2. 分类**** 1.2.1. 关系型数据库**** 1.2.1.1. SQL**** 1.2.2. 安装**** 1.2.2.1. Navicat**** 1.2.3. 非…...

服务器配置Huggingface并git clone模型和文件

服务器配置Huggingface并git clone模型和文件 参考:https://huggingface.co/welcome 1 注册hugging face 官网注册,并获取token【https://huggingface.co/settings/tokens】,用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...

Rust 开发的高性能 HTTP 请求工具

一、简述 在现在的软件开发领域,HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说,能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目,它被设计来高效执行HTTP请求&#…...

Android Studio 通过 WIFI 调试手机 app

操作流程 首先第一步,PC 和手机都需要连在同一个局域网 WIFI。 第二步,手机 USB 连上 PC,确保能查看到通过 USB 连上的设备: >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...

RabbitMQ高级笔记

视频链接:【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…...

【Qt】QtCreator交叉编译环境配置Qt mkspec

1、问题描述 在QtCreator中配置TI AM437x的交叉编译环境后,编译时报错,错误信息如下 error: gnu/stubs-soft.h: No such file or directory2、原因分析 1)环境变量CC 搜索网络,解决方法为修改交叉编译工具目录下环境配置脚本,即执行source时的文件。 本人环境为:linux…...

点点数据K参数加密逆向分析(RPC方案跟加密算法还原)

文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行,考研数学哪有这么容易的! 先说说这两本习题册,李永乐老师推出的新版660题,相较于18年前的版本,难度略有降低,更加适合初学者。因此,对于处于基础阶段的学习者来说,新版660…...

【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)

1. Redis客户端 Jedis 以redis命令作为方法名称,学习成本低,但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用(必须为每个线程分配独立的Jedis连接) lettuce 基于Netty实现,支持同步、异步和…...

Java中Filter和Interceptor的区别

概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet,而Interceptor不…...

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。 后端是Django框架,定时任务用Celery来实现的。 本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,…...

SpringBoot单元测试剖析

SpringBoot作为一种流行的Java框架,其单元测试的重要性不言而喻。在这篇博客中,我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节,它是对软件中的最小可测试单元进行检查和验证。对于…...

【华为OD机试C++】计算某字符出现次数

文章目录 描述输入描述输出描述示例代码 描述 写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母) 数据范围: 1 \le n \le 1000 …...

ORA-01779 BYPASS_UJVC 11.2后废弃了

有这么个update语句 update A t set status 1 where exists (select 1 from B B where B.code A.code) 因性能问题需要修改写法。 在oracle10G这么update是没问题的: update( select …...

验证码demo(简单实现)

前言 我们注意到我们登录网站的时候经常会用到网络验证码,今天我们就简单实现一个验证码的前后端交互问题,做一个小demo 准备 我们这里并不需要依靠原生的java来实现,而是只需要引入一个maven依赖,使用现成的封装好的即可,这是我使用的是hutool工具包 网址:Hutool🍬…...

C#面:虚函数和抽象函数的区别

C#中的虚函数和抽象函数都是实现多态性的重要概念,但它们有一些区别。 定义方式: 虚函数:在基类中使用 virtual 关键字定义,可以在派生类中被重写。抽象函数:在抽象类或接口中使用abstract 关键字定义,必…...

Vidmore Video Fix for Mac 视频修复工具

Vidmore Video Fix for Mac是一款功能强大且易于使用的视频修复工具,专为Mac用户设计。它凭借先进的视频修复技术,能够帮助用户解决各种视频问题,如视频文件损坏、无法播放、格式不支持等。 软件下载:Vidmore Video Fix for Mac v…...

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…...

328——二维矩阵值变为1最小操作次数 next、nextInt、nextLine

一、next、nextInt、nextLine区别 1.next() next()不光是接收键盘输入的内容,而且还进行分割。例如默认分隔符为空格 Scanner sc new Scanner(System.in);while (true){String str sc.next();System.out.println(str "A");}// 输出结果 input&#…...

HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)

同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。 由于TaskPool偏向于单个独…...

基于MiniExcel的三种常用导出Excel方法(固定列导出、动态列导出、按模板导出)

为了方便代码编写和测试,把很多代码都放在一个class里面,实际开发根据需要放到对应的目录下即可。 1.使用nuget下载安装miniexcel; 2.编写对应的测试接口,具体代码如下: using Microsoft.AspNetCore.Authorization; using Micr…...

MATLAB科研绘图与学术图表绘制从入门到精通

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…...

C++核心高级编程 --- 1、内存分区模型 2、引用

文章目录 第一章:1.内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 第二章:2.引用2.1 使用2.2 注意事项2.3 做函数参数2.4 做函数返回值2.5 本质2.6 常量引用 第一章: 1.内存分区模型 4个区域: 代码区:存放…...

winform日历控件_进度条控件

在 Windows Forms 应用程序中使用日历控件 (如 MonthCalendar 或 DateTimePicker) 和进度条控件 (如 ProgressBar) 是一个很好的练习,以了解这些控件的工作方式。以下是一些基本的步骤来实践这些控件: 日历控件: 添加 MonthCalendar 控件&am…...

Java进阶-反射的详解与应用

本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…...

蓝桥杯算法题——暴力枚举法

先估算这个数小于3的50次方 cnt0 for i in range(50):for j in range(50):for k in range(50):a3**ib5**jc7**kif a*b*c<59084709587505:cnt1 print(cnt-1)#当ijk都为0时&#xff0c;a*b*c1不是幸运数字所以要减去...

广州房地产网站建设/百度云

每年过年过节 被问工作&#xff0c;问薪酬&#xff0c;忙着应付各种问题&#xff0c;家里小孩也多&#xff0c;一年攒的钱包的红包就去掉了大半&#xff0c;这不赶紧趁着金九银十即将到来的这股热劲&#xff0c;开启了我的面试之路... 没办法啊&#xff0c;还是要进大厂搬砖&a…...

简单的网站设计怎么做/海外推广代理商

Hyperledger Fabric笔记2--运行fabric测试网络 1、获取fabric相关源代码 首先&#xff0c;需要在/opt/gopath中新建目录, mkdir -p /opt/gopath/src/github.com/hyperledger/ 其次&#xff0c;下载fabric源码&#xff0c;git clone https://github.com/hyperledger/fabric.g…...

徐州小学网站建设/搜索引擎 磁力吧

说明&#xff1a; 本文以nvie的“a successful git branching model”为蓝本&#xff0c;结合我个人理解写成。如有谬误&#xff0c;还请各位指出。多谢&#xff01; Note: This article is highly based on nvies a successful git branching model. Thanks nvie. Git Flow 是…...

美国主机网站建设/百度95099如何转人工

这里使用的是淘宝的接口 public class AddressUtil{ /** * * param content * 请求的参数 格式为&#xff1a;namexxx&pwdxxx * param encodingString * 服务器端请求编码。如GBK,UTF-8等 * return * throws UnsupportedEncodingException */ public static String getAddr…...

wordpress文章如何调整字体/广告咨询

与WifiMonitor.java负责监控supplicant状态不同&#xff0c;WifiService.java负责给supplicant下命令&#xff0c;WifiService.java是framework中wifi的核心模块。1 WifiService是server端&#xff0c;WifiManager是client端WifiService处理WifiManager发来的各种命令2 AsyncCh…...

长沙产品网站建设/单个药品营销策划方案

一、昨天完成的 因为昨天课程较满&#xff0c;所以没有写太多的代码&#xff0c;在功能实现的方面并没有实质性的进展。 二、今天做的 继续Text文本框添加文字&#xff0c;解决不能显示的问题&#xff0c;添加文本框可以出现在截图区域任意位置的功能。 三、出现的问题 添加的文…...