基于梯度的图像边缘检测

参考视频:https://www.bing.com/videos/search?q=a+computational+approach+to+edge+detection&docid=608014236869751913&mid=8C04384FFDD6A47533238C04384FFDD6A4753323&view=detail&FORM=VIRE
参考文献:A Computational Approach to Edge Detection

Edge Detection Using Gradients

1D边缘检测

边缘可以理解为一个小区域中图像强度的快速变化,假设f(x)的图像图下图所示:
在这里插入图片描述

那么很容易发现里面有2个边缘,一个上升一个下降的。
如果从梯度的角度进行理解,这两个边缘处在f(x)导数不为0的区域,其导函数如下图所示:

如果对导数取绝对值,那么可以发现边缘就处在峰值出现的地方。
在这里插入图片描述

2D边缘检测

推广一下1D的情况,在1D的情况下我们使用的是一阶导数,那么到了2D的情况,对应的就是偏导数,如果像素的位置用(x,y)表示,像素值用I(x,y)表示,那么I对x的偏导数就表示了在x方向上变化的速度,同理对y的偏导也是一样的,如果同时考虑2个偏导数,那么就是梯度向量 ∇ I \nabla I I
∇ I = [ ∂ I ∂ x , ∂ I ∂ y ] \nabla I = [\frac{\partial I}{\partial x}, \frac{\partial I}{\partial y}] I=[xI,yI]
下图展示了y方向上没有变化、x方向上没有变化以及两个方向都发生了变化的三种情况:
在这里插入图片描述

基于梯度我们可以定义梯度的大小和方向:
S = ∣ ∣ ∇ I ∣ ∣ = ( ∂ I ∂ x ) 2 + ( ∂ I ∂ y ) 2 S= ||\nabla I||=\sqrt{{(\frac{\partial I}{\partial x})}^2+{(\frac{\partial I}{\partial y})}^2} S=I=(xI)2+(yI)2
θ = t a n − 1 ( ∂ I ∂ y / ∂ I ∂ x ) \theta=tan^{-1}(\frac{\partial I}{\partial y}/\frac{\partial I}{\partial x}) θ=tan1(yI/xI)

在这里插入图片描述

离散化

由于真实处理的图像都是离散的像素点,因此我们要将导数都变成近似的离散值的计算,假设我们使用4个像素值来近似,那么如下式:
∂ I ∂ x ≈ 1 2 ϵ ( ( I i , j + 1 − I i + 1 , j + 1 ) + ( I i + 1 , j − I i , j ) ) \frac{\partial I}{\partial x}\approx \frac{1}{2\epsilon}((I_{i,j+1}-I_{i+1,j+1}) + (I_{i+1,j}-I_{i,j})) xI2ϵ1((Ii,j+1Ii+1,j+1)+(Ii+1,jIi,j))
∂ I ∂ y ≈ 1 2 ϵ ( ( I i + 1 , j + 1 − I i + 1 , j ) + ( I i , j + 1 − I i , j ) ) \frac{\partial I}{\partial y}\approx \frac{1}{2\epsilon}((I_{i+1,j+1}-I_{i+1,j}) + (I_{i,j+1}-I_{i,j})) yI2ϵ1((Ii+1,j+1Ii+1,j)+(Ii,j+1Ii,j))
其中, ϵ \epsilon ϵ是2个轴上的变化量。
图示:
在这里插入图片描述

可以发现,上面的式子是可以用卷积进行表示的:
在这里插入图片描述

把这种卷积称为梯度算子(Gradient Operators),实际上,我们还可以衍生出更多不同效果的梯度算子:

小的梯度算子和大的有什么区别?

小的算子可能会被局部的微小噪音干扰,而大的则对小噪音没有那么敏感,但是大的算子也会受到距离较远的像素的影像,localization没有小的算子好。

边缘阈值

如果要判断一个像素是不是属于边缘,那么就需要定义一个阈值,如果像素的梯度大小比阈值大,那么才认为是边缘:
∣ ∣ ∇ I ( x , y ) ∣ ∣ ≥ T ||\nabla I(x,y)||\ge T I(x,y)T
这是标准的方法,同时也可以定义一种类似于磁滞回线的方法,可以定义2个不同的阈值 T 0 T_0 T0 T 1 T_1 T1

  1. 如果梯度大小小于 T 0 T_0 T0,那么认为不是边缘。
  2. 如果梯度大小大于等于 T 1 T_1 T1,那么认为肯定是边缘。
  3. 如果在中间,那么当临近的像素是边缘的时候才认为它也是边缘。

效果如下图:
![[Pasted image 20221115135623.png]]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab提供了多种方法来进行图像边缘检测。下面我将介绍两种常用的方法:基于梯度边缘检测和基于Canny算子的边缘检测。 1. 基于梯度边缘检测: 基于梯度边缘检测方法利用图像中灰度值的变化来检测边缘。常用的方法有Sobel算子和Prewitt算子。 使用Sobel算子进行边缘检测的代码示例: ```matlab img = imread('image.jpg'); % 读取图像 gray_img = rgb2gray(img); % 转换为灰度图像 sobel_x = [-1 0 1; -2 0 2; -1 0 1]; % Sobel算子的水平方向模板 sobel_y = [-1 -2 -1; 0 0 0; 1 2 1]; % Sobel算子的垂直方向模板 gradient_x = imfilter(double(gray_img), sobel_x); % 计算水平方向梯度 gradient_y = imfilter(double(gray_img), sobel_y); % 计算垂直方向梯度 gradient_magnitude = sqrt(gradient_x.^2 + gradient_y.^2); % 计算梯度幅值 threshold = 100; % 设置阈值 edge_img = gradient_magnitude > threshold; % 根据阈值进行二值化 imshow(edge_img); % 显示边缘图像 ``` 2. 基于Canny算子的边缘检测: Canny算子是一种常用的边缘检测算法,它能够检测边缘的细节,并且对噪声具有较好的抑制效果。 使用Canny算子进行边缘检测的代码示例: ```matlab img = imread('image.jpg'); % 读取图像 gray_img = rgb2gray(img); % 转换为灰度图像 edge_img = edge(gray_img, 'Canny'); % 使用Canny算子进行边缘检测 imshow(edge_img); % 显示边缘图像 ``` 这些方法都可以用来进行图像边缘检测,具体选择哪种方法取决于你的需求和图像特点。你可以根据实际情况选择合适的方法进行边缘检测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值