基于梯度的图像边缘检测

参考视频: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)的图像图下图所示:
基于梯度的图像边缘检测_第1张图片

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

如果对导数取绝对值,那么可以发现边缘就处在峰值出现的地方。
基于梯度的图像边缘检测_第3张图片

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方向上没有变化以及两个方向都发生了变化的三种情况:
基于梯度的图像边缘检测_第4张图片

基于梯度我们可以定义梯度的大小和方向:
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)

基于梯度的图像边缘检测_第5张图片

离散化

由于真实处理的图像都是离散的像素点,因此我们要将导数都变成近似的离散值的计算,假设我们使用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个轴上的变化量。
图示:
基于梯度的图像边缘检测_第6张图片

可以发现,上面的式子是可以用卷积进行表示的:
基于梯度的图像边缘检测_第7张图片

把这种卷积称为梯度算子(Gradient Operators),实际上,我们还可以衍生出更多不同效果的梯度算子:
基于梯度的图像边缘检测_第8张图片

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

小的算子可能会被局部的微小噪音干扰,而大的则对小噪音没有那么敏感,但是大的算子也会受到距离较远的像素的影像,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. 如果在中间,那么当临近的像素是边缘的时候才认为它也是边缘。

效果如下图:
基于梯度的图像边缘检测_第9张图片

你可能感兴趣的:(深度学习,计算机视觉,人工智能,算法)