当前位置:网站首页>MATLAB实战Sobel边缘检测(Edge Detection)
MATLAB实战Sobel边缘检测(Edge Detection)
2022-08-11 08:43:00 【王大队长】
首先我们要明确几点基本概念:
1、检测边缘实际上就是求梯度
2、求梯度会放大我们的噪声
3、梯度的方向与我们的边缘的方向垂直
如果对1不清楚的话建议看看这篇博客:
如果对2不清楚的话建议看看我的这篇博客来看看仿真结果:
如果对3不清楚的话可以理解下下面这张图:

左下为全黑像素,右上为全白像素,那么对角线就是边界!我们的梯度方向显然是从黑到白即45°即▽F方向,而我们的边缘方向为-45°阶梯方向,显然垂直!

浅析Sobel算子:
首先这是一个检测垂直边缘的Sobel算子(如果你不清楚的话我们会在后面进行代码验证):

这个矩阵可以看成这两个矩阵相乘:

而前面一个向量是垂直方向的一阶导(所以是检测垂直边缘), 后面一个向量则是进行平滑(为了平滑求导放大的噪声)!
下面我们看一下代码实验与结果:
首先我们有一张拥有明显边缘的图片doorbell.jpg:

clc;clear;
im = imread('doorbell1.jpg');
im = rgb2gray(im);
hx = [-1 -2 -1; 0 0 0;1 2 1]; %检测水平边缘的sobel滤波器
hy = hx'; %检测垂直边缘的sobel滤波器
gx = filter2(hx, im);
gy = filter2(hy, im);
figure(1);
imshow(abs(gy),[]);
colormap jet;
colorbar;
让我们看看结果:
红色的值比较高,代表很强的垂直边缘,蓝色的值比较低代表很弱的垂直边缘。
从图中放大可以看到,水平部分比较红,垂直部分比较蓝:

这验证了我们的理论是正确的!
让我们将imshow(abs(gx),[])中的gx改为gy查看结果:

放大可以看到水平部分值比较高!

再次验证了我们的理论!
上面看的都是我们的水平梯度和垂直梯度,下面让我们看下梯度的赋值和角度!
在上述代码后面加上
magnitude = sqrt(gx.^2 + gy.^2);
angel = atan(gy./gx)*180/pi; %转换到角度
figure(2);
imshow(magnitude,[]);
colormap jet;
colorbar;
figure(3);
imshow(angel,[]);
colormap jet;
colorbar;

幅值上不难理解,基本上有边缘的地方值会比较大!
角度上也很直观,右边的的颜色柱标明了角度!
有了幅值和角度,我们就可以自己筛选任意自己想要的边缘!
比如我们想把所有的这些40°左右的边缘检测出来:

因为通过观察上面的幅度图和角度图可以发现这些部分的幅度大约在100,角度大约为40°,所以我们在上面代码的基础上添加下面这一段代码,就可以实现!
e = ((abs(magnitude - 200) < 30) & (abs(angel - 40)<10));
figure(4);
imshow(e,[]);
colormap jet;
colorbar;结果:
可以发现检测效果还是不错的!
边栏推荐
- Kotlin算法入门求回文数算法优化一
- Filesystem Hierarchy Standard
- 用 Antlr 重构脚本解释器
- 音视频+AI,中关村科金助力某银行探索发展新路径 | 案例研究
- Song of the Cactus - Massive Rapid Expansion (1)
- 分门别类输入输出,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本数据类型和输入输出EP03
- 持续集成/持续部署(2)Jenkins & SonarQube
- 快速幂,逆元的求解
- One network cable to transfer files between two computers
- 基础SQL——DDL
猜你喜欢

VoLTE基础自学系列 | 3GPP规范解读之Rx接口(上集)

IPQ4019/IPQ4029 support WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975

如何通过开源数据库管理工具 DBeaver 连接 TDengine

go-grpc TSL authentication solution transport: authentication handshake failed: x509 certificate relies on ... ...

进阶-指针

9、Neural Sparse Voxel Fields

Mysql JSON对象和JSON数组查询

Redis 只会用缓存?20种妙用让同事直呼牛X(荣耀典藏版)

2022-08-10:为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机, 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1, 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹

机器学习(一)数据的预处理
随机推荐
ASP.NET Core 6框架揭秘实例演示[32]:错误页面的集中呈现方式
迷你图书馆系统(对象+数组)
Initial use of IDEA
Kotlin算法入门求自由落体
Openlayers 聚合图、权重聚合图以及聚合图点击事件
dsu on tree(树上启发式合并)学习笔记
【实战系列】OpenApi设计规范
Getting Started with Kotlin Algorithms Calculating Prime Numbers and Optimization
高德能力API
tensorflow 基础操作1(tensor 基本属性 , 维度变换,数学运算)
中国电子学会五级考点详解(一)-string类型字符串
基于 VIVADO 的 AM 调制解调(1)方案设计
基于 VIVADO 的 AM 调制解调(3)仿真验证
Inventorying Four Entry-Level SSL Certificates
jenkins 流水线脚本详细解析Pipeline
Unity3D - modification of the Inspector panel of the custom class
兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
法律顾问成了律所鸡肋产品了吗?
【C语言】每日一题,求水仙花数,求变种水仙花数
Machine Learning Summary (2)